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


有什么区别

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

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


7374
2017-09-15 07:35


起源

它与SQL隐式vs显式连接相同。两者都是连接,但第二个是显式的。 - spender
它''适合你' - 哈看看我在那里做了什么 - PostMan


答案:


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

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

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

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


14
2017-09-15 07:46





JOIN是一种通过使用每个表共有的值来组合来自两个(或更多)表的字段的方法。

WHERE子句指定SQL(数据操作语言)语句应仅影响满足指定条件的行(将WHERE子句视为FILTER)。


1
2017-09-15 07:41



完全不回答我的问题:( - Difference Engine
啊,LINQ查询的语义是否与ANSI SQL查询的语义不同(w.r.t. WHERE和JOIN)? - Joubert Nel
当然,即使在SQL查询中,这也不能回答这个问题。你说“A JOIN是一种结合两个表中字段的方法”,但肯定是这样 from a, b where a.Field=b.Field,所以它没有回答这个问题的区别。 - Timwi
@timwi当然,连接(显式或隐式)可以包含WHERE子句(WHERE子句充当过滤器)。也许我应该解决具体问题 例 而不是解释连接和WHERE子句之间的概念差异。 - Joubert Nel
SQL的最大区别在于清晰度 - 当使用JOIN语法时,例如,检测可能导致笛卡尔积的不完整连接条件会更容易。它有助于区分连接条件和过滤/限制条件。 - Adam Musch


在实践中,根据许多其他因素,您可以通过使用一个而不是另一个来获得性能提升。我想(虽然我实际上没有基础)连接比WHERE子句更可靠。

编辑:结果我完全错了。 (应该)两种类型之间的性能没有差别。但是,较新的样式(使用JOIN)阅读(imo)要清楚得多,而且,微软已经表示他们不会支持旧样式(使用WHERE的外部联接)。


0
2017-09-15 07:46





实际上在SQL中, join-on 语句可以写成 from-where 陈述(如果你真的想要)。但是你知道我们有 left join  left outer join SQL语句中的等等,这使我们更容易表达我们想要的东西(当然你也可以使用 from-where 但它会使你的代码看起来很疯狂)。所以我们总是使用 where 如果我们想要在使用时过滤我们的结果 join 如果表之间有关系。


0
2017-09-15 07:47





实际上,第一个查询是说:“对这些集合进行交叉连接(基本上创建一个NxM矩阵),然后只获取沿对角线的那些,并将它们交给我”

实际上,第二个查询是“仅创建一个列表,其中包含与该等项目相匹配的组合项目”。

结果是一样的,但到达那里的过程有点不同。

由于SQL数据库通常是高度优化的,因此当您要求第一个时,服务器只会说“Idiot user ....”,并替换第二个。

在非SQL环境(如Linq-to-Objects)中,如果你要求第一个,那就是它会做什么,并且你会看到一个重要的性能影响。


0
2017-09-15 14:24