这两个linq查询之间是否存在性能差异,它们是相同的还是本质上不同

本文关键字:本质上 性能 两个 linq 存在 是否 之间 查询 | 更新日期: 2023-09-27 18:06:38

where子句的顺序重要吗?

  from x in A.where(x=>CriteriaA(x))
  from y in B where(y=>CriteriaB(y))
  where CriteriaC(x,y)

  from x in A
  from y in B
  where(x=>CriteriaA(x))
  where(y=>CriteriaB(y))
  where CriteriaC(x,y)
  from x in A
  from y in B
  where(y=>CriteriaB(y))
  where(x=>CriteriaA(x))
  where CriteriaC(x,y)

Update: All are IEnumerable<> and Linq to Objects

使用Jon Skeet的场景:A有100个条目,其中25个符合CriteriaAB有100个条目,其中50个匹配CriteriaB

第一个方法,将有100个呼叫CriteriaA, 2500个呼叫CriteriaB, 1250个呼叫CriteriaC

第二个方法,将有10000个呼叫CriteriaA, 2500个呼叫CriteriaB, 1250个呼叫CriteriaC

第三种方法,有10000个呼叫CriteriaB, 5000个呼叫CriteriaA, 1250个呼叫CriteriaC

正确吗?

这两个linq查询之间是否存在性能差异,它们是相同的还是本质上不同

这将部分取决于这是否是LINQ到对象,LINQ到SQL等。让我们假设LINQ to Objects

想象一下这个场景:

  • A有100个条目,其中25个符合CriteriaA
  • B有100个条目,其中50个匹配CriteriaB

那么在第一个场景中,将有100个呼叫到CriteriaA, 2500个呼叫到CriteriaB, 1250个呼叫到CriteriaC。

在第二个场景中,将有10,000个呼叫到CriteriaA, 2500个呼叫到CriteriaB, 1250个呼叫到CriteriaC。

如果您像这样"具体化"一个Where调用的结果:

var resultsB = B.Where(y => CriteriaB(y)).ToList();
from x in A.Where(x => CriteriaA(x)).ToList()
from y in resultsB
where CriteriaC(x,y)

那么将有100个对CriteriaA的调用,100个对CriteriaB的调用,以及1250个对CriteriaC的调用。显然,这会占用更多的内存,因为它需要缓存结果

我希望第一种方法更快,因为获取的数据更少。

但这可能取决于数据集,当然这与IEnumerable<>IQueryable<>有关。

如果你真的想知道:测量。