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

LINQ-使用where或join-性能差异?,linq,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,

基于这个问题:

我的问题如下:

以下两种说法是否存在性能差异:

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 };

我总是使用第二个,因为它更清晰

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


谢谢。

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

使用LINQ to对象,它将绝对构建笛卡尔积,并随后进行过滤

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


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

from file in files
from line in ReadLines(file)
...
我现在的问题是,第一个比第二个慢吗?它是否构建了一个cartesic产品,然后使用where子句对其进行过滤

如果集合在内存中,则为是。LinqToObjects没有查询优化器——它只是按照要求的顺序执行程序员的要求

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

  • 检查执行计划
  • 或测量IO(打开统计IO)

有性能差异吗


如果你发现自己处于一个必须提问的情境中,你应该培养工具,用它来衡量和发现自己的真相。测量-不问。

回答得很好,使用联接时性能应该更好?@Patrick:性能将取决于具体情况。如果linqtosql将其转换为相同的SQL,那么显然这不会有什么区别。但是,是的,一般来说,联接的性能应该更好。我敢肯定,在某些特殊情况下,情况并非如此:)
from file in files
from line in ReadLines(file)
...