0

直到实际迭代查询返回的序列后,才执行 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
}

PS 我正在使用 Linq-To-EF,如果它有什么不同的话。

4

1 回答 1

2

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

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

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

于 2011-04-23T06:23:18.820 回答