另外,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)
Run Code Online (Sandbox Code Playgroud)
更新:所有都是IEnumerable <>和Linq to Objects
使用Jon Skeet的场景:A有100个条目,其中25个匹配CriteriaA B有100个条目,其中50个匹配CriteriaB
第一种方法,将有100个呼叫CriteriaA,2500个呼叫CriteriaB和1250个呼叫CriteriaC.
第二种方法,将有10000个呼叫CriteriaA,2500个呼叫CriteriaB和1250个呼叫CriteriaC.
第三种方法,将有10000个呼叫CriteriaB,5000个呼叫CriteriaA和1250呼叫CriteriaC.
那是对的吗?
它部分取决于它是LINQ to Objects,LINQ to SQL等.让我们假设LINQ to Objects.
想象一下这种情况:
A 有100个条目,其中25个符合CriteriaAB 有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)
Run Code Online (Sandbox Code Playgroud)
然后将有100次调用CriteriaA,100次调用CriteriaB,以及相同的1250调用CriteriaC.显然,这会占用更多内存,因为它必须缓存结果