返回Enumerable.Empty <T>().AsQueryable()一个坏主意?

Oce*_*t20 6 .net c# linq iqueryable linq-to-sql

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

dle*_*lev 11

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

但是,如果您的目标是返回查询的当前状态,那么您的方法应该只返回IList<T>这些行或类似的东西.然后,您可以返回一个空List<T>,或者调用.ToList()您构造的查询并返回该查询.

一般来说,我会尽量避免返回空的可查询对象,因为它可能会误导调用者他们实际获得的内容.