这两个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到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<>
有关。
如果你真的想知道:测量。