这可能最好用一些代码来解释:
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;
}
}
这个想法是,如果没有currentlyHeldId可以查询,就没有理由再查询数据库。如果currentlyHeld没有值,LINQ to SQL仍然会查询数据库。这种方法有什么问题吗?我意识到,一般来说,还有一些其他问题与返回IQueryable有关,但撇开这些争论不谈,像这样试图绕过db调用有什么错吗?
我认为你应该重新思考你的函数实际要做什么。如果你返回一个IQueryable<T>
,那么这意味着调用者将存储结果查询,并在他们实际执行查询时收到最新的结果。记住:在这种情况下,数据库实际上不会被查询,直到对查询调用.ToList()
、.ToArray()
、foreach
等。
但是,如果您的目标是返回查询的当前状态,那么您的方法应该只返回IList<T>
或类似的内容。然后,您可以返回一个空的List<T>
,或者对您构建的查询调用.ToList()
并返回该查询。
一般来说,我会尽量避免返回空的可查询项,因为这可能会误导调用者他们实际得到的内容。
对我来说似乎很好。如果从消费端来看功能完全相同,那应该是非常好的。