之间有什么区别

var q_nojoin = from o in one
               from t in two
               where o.SomeProperty == t.SomeProperty
               select new { o, t };


var q_join = from o in one
             join t in two on o.SomeProperty equals t.SomeProperty
             select new { o, t };

他们似乎给我相同的结果。

最佳答案

它们给出相同的结果,但是联接要快得多,除非您使用LINQ to SQL,以便数据库可以优化查询。

我用两个包含5000个项目的数组进行了测试,带有连接的查询比不带有连接的查询快大约450倍(!)。

如果使用LINQ to SQL,则数据库将优化两个查询以完成相同的工作,因此在这种情况下,性能没有差异。但是,显式联接被认为更具可读性。

如果对其他数据源使用LINQ,则没有优化层,因此查询的工作方式会有很大不同。联接使用哈希表或类似的表来快速查找匹配值,而没有联接的查询将比较一个表中的所有项目与另一表中的每个项目。联接的复杂度大约为O(n + m),而没有联接的查询的复杂度为O(n * m)。这不仅意味着没有联接的查询速度较慢,而且伸缩性很差,因此随着数据的增长,查询速度将呈指数级下降。

10-08 05:21