LINQ - 使用where或join - 性能差异?

时间:2010-06-10 12:02:24

标签: linq

基于这个问题: What is difference between Where and Join in linq?

我的问题如下:

以下两个陈述是否存在性能差异:

from order in myDB.OrdersSet
    from person in myDB.PersonSet
    from product in myDB.ProductSet
    where order.Persons_Id==person.Id && order.Products_Id==product.Id
    select new { order.Id, person.Name, person.SurName,  product.Model,UrunAdı=product.Name };

from order in myDB.OrdersSet
    join person in myDB.PersonSet on order.Persons_Id equals person.Id
    join product in myDB.ProductSet on order.Products_Id equals product.Id
    select new { order.Id, person.Name, person.SurName,  product.Model,UrunAdı=product.Name };

我总是会使用第二个因为它更清楚。

现在我的问题是,第一个比第二个慢吗? 它是否构建了一个cartesic产品,然后使用where子句过滤它?

谢谢。

2 个答案:

答案 0 :(得分:3)

这完全取决于您使用的提供商。

使用LINQ to Objects,它绝对会构建Cartesian产品并在之后进行过滤。

对于进程外查询提供程序(如LINQ to SQL),它取决于它是否足够智能以实现它可以将其转换为SQL连接。即使LINQ to SQL没有,查询引擎实际执行查询也可能会这样做 - 您必须检查数据库的相关查询计划工具,看看实际会发生什么。


旁注:多个“from”子句并不总是产生笛卡尔积 - 一个“from”的内容可能取决于先前的元素的当前元素,例如

from file in files
from line in ReadLines(file)
...

答案 1 :(得分:1)

  

现在我的问题是,第一个比第二个慢吗?它是否构建了一个cartesic产品,然后使用where子句过滤它?

如果收藏品在内存中,则是。 LinqToObjects没有查询优化器 - 它只是执行程序员按要求的顺序询问的内容。

如果集合在数据库中(由于myDB变量而怀疑),则没有。查询被转换为sql并发送到存在查询优化器的数据库。此优化程序将生成执行计划。由于两个查询都要求相同的逻辑结果,因此期望为两者生成相同的有效计划是合理的。唯一可以确定的方法是

  • 检查执行计划
  • 或测量IO(SET STATISTICS IO ON)。

  

是否存在性能差异

如果你发现自己处于一个你必须要求的场景中,你应该培养出能够衡量和发现真相的工具。措施 - 不要问。