此外,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)
更新:所有都是IEnumerable<>和Linq到对象
使用Jon Skeet的场景: A有100个条目,其中25个与CriteriaA匹配 B有100个条目,其中50个符合CriteriaB
第一种方法,将有100次拨打CriteriaA
,2500次拨打CriteriaB
,拨打1250拨打CriteriaC
。
第二种方法,将有10000次拨打CriteriaA
,2500次拨打CriteriaB
,拨打1250拨打CriteriaC
。
第3种方法,将有10000次拨打CriteriaB
,拨打CriteriaA
拨打电话,拨打CriteriaC
拨打1250。
这是对的吗?
答案 0 :(得分:5)
部分取决于它是LINQ to Objects,LINQ to 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。显然,这会占用更多内存,因为它必须缓存结果
答案 1 :(得分:1)
我希望第一个更快,因为获取的数据更少。
但它可能取决于数据集,当然重要的是这是IEnumerable<>
还是IQueryable<>
。
如果你真的想知道:措施。