在查询返回的序列实际迭代之前,不会执行Linq查询。
我有一个反复使用的查询,因此我将把它封装在一个方法中。我想知道它是否会干扰延期执行 如果我将Linq查询封装到如下方法中, 查询在第2行执行,而不是在调用方法的第1行执行。这是对的吗?
public IEnumerable<Person> GetOldPeopleQuery()
{
return personList.Where(p => p.Age > 60);
}
public void SomeOtherMethod()
{
var getWomenQuery = GetOldPeopleQuery().Where(p => p.Gender == "F"); //line 1
int numberOfOldWomen = getWomanQuery.Count(); //line 2
}
P.S。如果它有任何不同,我正在使用Linq-To-EF。
答案 0 :(得分:2)
当您第一次枚举结果时,该查询是惰性求值的,不受将其放入方法的影响。
然而,您的代码中存在另一个效率非常低的问题。一旦返回IEnumerable
,应用于集合的下一个linq语句将是linq-to-objects查询。这意味着在您的情况下,您将从数据库中加载所有老人,然后过滤掉内存中的女性。与计数相同,它将在内存中完成。
如果您改为返回IQueryable<Person>
,那么将使用linq-to-entities评估这两个问题,并且可以在数据库中完成过滤和求和。