【问题标题】:How does LINQ Where() clause in .Net work?.Network 中的 LINQ Where() 子句如何?
【发布时间】:2014-05-01 13:28:18
【问题描述】:

我想知道 LINQ Where() 是如何实现的。它是否对集合执行简单的线性搜索?或者有没有优化?

【问题讨论】:

标签: c# .net linq search where


【解决方案1】:

简短回答:视情况而定。

更长的答案:LINQ 的目的是允许开发人员表达查询的意图,而无需提供如何执行查询。我们可以对几乎任何可以表示为集合的内容使用相同的查询语法。

对于 LINQ to Objects,它目前只是执行您所描述的操作 - 序列的线性遍历。在底层,LINQ 可以使用IQueryProvider如何推迟到更复杂的实现。

提供者的工作是将查询(例如,Where(predicate))转换为实际执行的代码。对于实体框架中的 LINQ to SQL 或 LINQ to Entities 之类的东西,它会将查询转换为 SQL 并执行它。

所以在基本层面上,这个想法是“无关紧要”它是如何工作的——它应该通过更加声明性地编写查询来帮助开发人员提高工作效率。但是查找您正在使用的特定 LINQ 提供程序的文档会很有帮助,这样您就可以了解如何最有效地利用它。

【讨论】:

  • 嗯,这就是基于 Queryable 的实现所做的。 LINQ to Objects 不涉及 IQueryProvider...
  • @JonSkeet 重新组织了措辞以更准确地反映这一点。
【解决方案2】:

正如MSDN documentation 所说:

LINQ 引入了标准的、易于学习的查询模式和 更新数据,并且可以扩展技术以支持 可能是任何类型的数据存储

因此,Where 函数的工作原理本质上取决于集合下使用的 LINQ 提供程序。 LINQ to objects 将执行类似于您所说的搜索,而 LINQ to Entities 会将其转换为 SQL WHERE 子句并在数据库上执行以返回对象。

【讨论】:

    【解决方案3】:

    它只是迭代:

    foreach (TSource element in source) { 
      if (predicate(element)) yield return element; 
    }
    

    【讨论】:

    • 这适用于 LINQ to Objects,但不适用于基于 IQueryable 的 LINQ(我没有否决您的答案)。
    • 是的,我应该更具体一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多