有什么区别
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)。这意味着不仅没有连接的查询速度较慢,而且它的扩展性也很差,因此随着数据的增长,它将以指数方式变慢。
JOIN是一种通过使用每个表共有的值来组合来自两个(或更多)表的字段的方法。
WHERE子句指定SQL(数据操作语言)语句应仅影响满足指定条件的行(将WHERE子句视为FILTER)。
在实践中,根据许多其他因素,您可以通过使用一个而不是另一个来获得性能提升。我想(虽然我实际上没有基础)连接比WHERE子句更可靠。
编辑:结果我完全错了。 (应该)两种类型之间的性能没有差别。但是,较新的样式(使用JOIN)阅读(imo)要清楚得多,而且,微软已经表示他们不会支持旧样式(使用WHERE的外部联接)。
实际上在SQL中, join-on
语句可以写成 from-where
陈述(如果你真的想要)。但是你知道我们有 left join
left outer join
SQL语句中的等等,这使我们更容易表达我们想要的东西(当然你也可以使用 from-where
但它会使你的代码看起来很疯狂)。所以我们总是使用 where
如果我们想要在使用时过滤我们的结果 join
如果表之间有关系。
实际上,第一个查询是说:“对这些集合进行交叉连接(基本上创建一个NxM矩阵),然后只获取沿对角线的那些,并将它们交给我”
实际上,第二个查询是“仅创建一个列表,其中包含与该等项目相匹配的组合项目”。
结果是一样的,但到达那里的过程有点不同。
由于SQL数据库通常是高度优化的,因此当您要求第一个时,服务器只会说“Idiot user ....”,并替换第二个。
在非SQL环境(如Linq-to-Objects)中,如果你要求第一个,那就是它会做什么,并且你会看到一个重要的性能影响。