【问题标题】:does putting Linq query inside a method affect deferred excecution?将 Linq 查询放在方法中会影响延迟执行吗?
【发布时间】:2011-04-23 06:18:17
【问题描述】:

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

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

【问题讨论】:

    标签: c# linq deferred-execution


    【解决方案1】:

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

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

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

    【讨论】:

    • 在这个问题中没有迹象表明实际上涉及到数据库。但如果是这样,我同意你关于效率低下的观点。
    • 谢谢!所以我将改用 IQueryable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多