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

时间:2011-08-26 10:18:05

标签: 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)

更新:所有都是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。

这是对的吗?

2 个答案:

答案 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<>

如果你真的想知道:措施。