在哪里和加入有什么区别?

Dif*_*ine 11 c# linq

有什么区别

var q_nojoin = from o in one
               from t in two
               where o.SomeProperty == t.SomeProperty
               select new { o, t };
Run Code Online (Sandbox Code Playgroud)

var q_join = from o in one
             join t in two on o.SomeProperty equals t.SomeProperty
             select new { o, t };
Run Code Online (Sandbox Code Playgroud)

他们似乎给了我相同的结果.

Guf*_*ffa 14

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

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

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

如果您针对不同的数据源使用LINQ,则没有优化层,因此查询的工作方式存在显着差异.连接使用哈希表或类似方法快速查找匹配值,而没有连接的查询将比较一个表中的所有项目与另一个表中的每个项目.连接的复杂性大致为O(n + m),而没有连接的查询的复杂性为O(n*m).这意味着不仅没有连接的查询速度较慢,而且它的扩展性也很差,因此随着数据的增长,它将以指数方式变慢.