我应该在我的LINQ查询中使用两个“where”子句或“&&”?

当写一个LINQ查询有多个“和”条件时,我应该写一个where子句包含&&或多个where子句,每个条件一个?

 static void Main(string[] args) { var ints = new List<int>(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提供者可能能够更好地处理多个而不是更复杂的expression; 这是真的?

我个人总是会用&&与两个where子句一起去,只要它不使这个语句无法理解。

在你的情况下,它可能根本不会被察觉,但如果你有一个大的集合,并且如果你使用这个查询的所有结果,那么有2个where子句肯定会对性能产生影响。 例如,如果对结果调用.Count(),或遍历整个列表,则将运行第一个where子句,创build一个新的IEnumerable,再次完全枚举第二个委托。

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

如果你把它们分开,事情就会改变。 由于您的第一个where子句通过原始集合枚举,第二个where子句列举它的结果。 这可能会导致(最糟糕的情况下)通过您的集合和每个成员调用2个委托进行2次完全枚举,这可能意味着这个语句(理论上)可能会花费两倍的运行时速度。

如果你决定使用2 where子句,首先放置限制性较强的子句将会有所帮助,因为第二个where子句只在传递第一个子句的元素上运行。

现在,就你而言,这并不重要。 在一个大集合,它可以。 作为一般的经验法则,我去:

1)可读性和可维护性

2)性能

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

这主要是个人风格的问题。 就个人而言,只要where子句符合一行,我就将这些子句分组。

使用多个地方往往是性能较差,因为它需要一个额外的委托调用的每个元素,使它到目前为止。 但是,这可能是一个微不足道的问题,只有在剖析器显示问题时才应该考虑。

性能问题仅适用于基于内存的集合… Linq to SQL生成推迟执行的expression式树。 更多细节在这里:

使用LINQ扩展方法的多个WHERE子句

像其他人所说的那样,这更多的是个人喜好。 我喜欢使用&&,因为它更具可读性,模仿其他主stream语言的语法。