代码之家  ›  专栏  ›  技术社区  ›  kamahl

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

  •  5
  • kamahl  · 技术社区  · 16 年前

    基于这个问题: 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 回复  |  直到 9 年前
        1
  •  3
  •   Jon Skeet    16 年前

    使用linqto对象,它绝对会构建笛卡尔积并在之后进行过滤。

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


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

    from file in files
    from line in ReadLines(file)
    ...
    
        2
  •  1
  •   Amy B    16 年前

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

    那么是的 . LinqToObjects没有查询优化器——它只是按照要求的顺序执行程序员的要求。

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

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

    如果你发现自己处于一个不得不问的情境中,你应该培养一些工具来衡量和发现自己的真相。量度——不问。