基于这个问题: 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子句过滤它?
谢谢。
答案 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并发送到存在查询优化器的数据库。此优化程序将生成执行计划。由于两个查询都要求相同的逻辑结果,因此期望为两者生成相同的有效计划是合理的。唯一可以确定的方法是
是否存在性能差异
如果你发现自己处于一个你必须要求的场景中,你应该培养出能够衡量和发现真相的工具。措施 - 不要问。