我有这个查询
from a in objects
where a.property1 == 2
&& a.property2 == 3
select a
并且
from a in objects
where a.property1 == 2
where a.property2 == 3
select a
我想知道语句执行方式是否有实质性的差别,同时使用它们的好处是什么。
目前我的问题是关于linq to objects的。
您的第一个案例将被转换为:
objects.Where(a => a.property1 == 2 && a.property2 == 3);
而后者将被转换为:
objects.Where(a => a.property1 == 2).Where(a => a.property2 == 3);
实际上,这两个语句是相同的,因为C#只有在左侧为true时才评估AND操作的右侧。
如果C#不懒惰地进行AND评估,那么顺序的WHERE评估可能会在大多数项目未能满足第一个标准(或第二个标准是昂贵的评估)的情况下提供相当显著的性能提升。然而,由于C#默认是懒惰的,因此执行效果与懒惰评估的LINQ相当。
&&
,那么 LINQ 将在接受项目进入结果之前检查两个属性。很难说这样做是否比先循环第一个结果,然后再次过滤(导致更多的内存分配)表现得更好,因为情况各不相同。我猜前者在大多数情况下会更快——一次全部完成——特别是因为它将立即减少列表的大小,这意味着内部分配的内存更少。由于它是惰性的,所以在大多数情况下肯定会更快。 - pickypg如果基础的LINQ提供程序不同,那么就会有所差异。LINQ提供程序负责将LINQ查询转换为底层的函数表示,例如SQL。
对我来说,真正的区别在于可读性。两个链接的where语句会降低可读性。
where
。 - DJ Burb.Where(...).Where(...)
。 - Ilya Ivanov