当前位置:  开发笔记 > 编程语言 > 正文

我应该在LINQ查询中使用两个"where"子句或"&&"吗?

如何解决《我应该在LINQ查询中使用两个"where"子句或"&&"吗?》经验,为你挑选了3个好方法。

在编写具有多个"和"条件的LINQ查询时,我应该编写where包含&&多个where子句的单个子句,每个条件一个吗?

static void Main(string[] args)
{
    var ints = new List(Enumerable.Range(-10, 20));

    var positiveEvensA = from i in ints
                         where (i > 0) && ((i % 2) == 0)
                         select i;

    var positiveEvensB = from i in ints
                         where i > 0
                         where (i % 2) == 0
                         select i;

    System.Diagnostics.Debug.Assert(positiveEvensA.Count() == 
                                         positiveEvensB.Count());
}

是否有任何差别比之间的个人喜好或编码风格(排长队,可读性等)等positiveEvensApositiveEvensB

想到的一个可能的区别是,不同的LINQ提供者可能能够更好地处理多个wheres而不是更复杂的表达; 这是真的?



1> Reed Copsey..:

我个人总是会使用&&与两个where子句一起使用,只要它不会使语句难以理解.

在你的情况下,它可能不会是都明显可言,但有2 where子句肯定会影响性能,如果你有一个大集合,如果你用所有的结果从该查询.例如,如果在结果上调用.Count(),或者遍历整个列表,则会运行第一个where子句,创建一个将再次完全枚举的新IEnumerable,并使用第二个委托.

将2个子句链接在一起会导致查询形成单个委托,该委托在枚举集合时运行.这导致通过集合进行一次枚举,并在每次返回结果时调用一次委托.

如果你拆分它们,情况会发生变化.当你的第一个where子句枚举原始集合时,第二个where子句枚举它的结果.这可能(最坏的情况)导致通过集合的2个完整枚举和每个成员调用2个委托,这可能意味着此声明(理论上)可能需要2倍的运行时速度.

如果您决定使用2 where子句,则首先放置更具限制性的子句将有很大帮助,因为第二个where子句仅在传递第一个子句的元素上运行.

现在,在你的情况下,这没关系.在大型系列上,它可以.作为一般经验法则,我会去:

1)可读性和可维护性

2)表现

在这种情况下,我认为这两个选项都是同样可维护的,所以我会选择性能更高的选项.


使用2"where"子句,这仍然只是一个迭代,每个项目有2个委托调用 - 而不是声称的2次迭代.
Marc,当我说两次迭代时,我应该更明确.使用2 where子句,您可以构造两个单独的枚举器 - 第一个创建一个由第二个枚举的枚举器.但这很小 - 它没有做2个循环,只是使用单独的枚举器进行枚举.
我认为`Where`对multiple where子句有一些特殊的优化.由于多个委托调用,它仍然会变慢.

2> JaredPar..:

这主要是个人风格问题.就个人而言,只要该where条款适用于一行,我就对这些条款进行分组.

使用多个wheres往往性能较差,因为它需要对每个元素进行额外的委托调用才能实现这一目标.然而,它可能是一个微不足道的问题,只有在剖析器显示它是一个问题时才应该考虑.



3> 小智..:

性能问题仅适用于基于内存的集合。Linq to SQL生成延迟执行的表达式树。此处有更多详细信息:

具有LINQ扩展方法的多个WHERE子句

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有