将Linq查询放在方法中会影响延迟执行吗?

时间:2011-04-23 06:18:18

标签: c# linq deferred-execution

在查询返回的序列实际迭代之前,不会执行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。

1 个答案:

答案 0 :(得分:2)

当您第一次枚举结果时,该查询是惰性求值的,不受将其放入方法的影响。

然而,您的代码中存在另一个效率非常低的问题。一旦返回IEnumerable,应用于集合的下一个linq语句将是linq-to-objects查询。这意味着在您的情况下,您将从数据库中加载所有老人,然后过滤掉内存中的女性。与计数相同,它将在内存中完成。

如果您改为返回IQueryable<Person>,那么将使用linq-to-entities评估这两个问题,并且可以在数据库中完成过滤和求和。