这两个linq查询之间是否有任何性能差异,它们是相同还是本质上不同?

col*_*ang 0 c# linq

另外,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.

那是对的吗?

Jon*_*eet 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)
Run Code Online (Sandbox Code Playgroud)

然后将有100次调用CriteriaA,100次调用CriteriaB,以及相同的1250调用CriteriaC.显然,这会占用更多内存,因为它必须缓存结果