返回Enumerable.Empty <t>()。AsQueryable()是一个坏主意?</t>

时间:2011-06-02 22:13:18

标签: c# .net linq linq-to-sql iqueryable

最好用一些代码解释这个:

public IQueryable<DatabaseRecord> GetQueryableLinkedRecords()
{
    if(this.currentlyHeldIds.Count() == 0)
    {
        return Enumerable.Empty<DatabaseRecord>().AsQueryable();
    }
    else
    {
        return from r in this.DBContext.DatabaseRecords
               where this.currentlyHeldIds.Contains(r.Id)
               select r;
    }
}

这个想法是,如果没有要查询的currentHeldId,则没有理由再次实际查询数据库。如果currentHeldIds没有值,LINQ to SQL仍将查询db。这种方法有什么问题吗?我意识到还有一些其他问题与返回IQueryable有关,但抛开那些论点,试图绕过这样的db调用有什么不对吗?

2 个答案:

答案 0 :(得分:11)

我认为你应该重新思考你的功能实际上要做什么。如果您返回IQueryable<T>,那么暗示调用者将存储生成的查询,并在实际执行查询时收到最新结果。请记住:在查询.ToList().ToArray()foreach等之前,实际上不会查询数据库。

但是,如果您的目标是返回查询的当前状态,那么您的方法应该只返回IList<T>或其他内容。然后,您可以返回空的List<T>,或者在您构建的查询上调用.ToList()并返回该值。

一般情况下,我会尽量避免返回空的可查询对象,因为它会误导来电者他们实际得到的内容。

答案 1 :(得分:1)

对我来说似乎很好。如果功能在消费方面是相同的,那应该是非常好的。