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

时间:2010-09-15 07:35:32

标签: c# linq

之间有什么区别
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 };

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

5 个答案:

答案 0 :(得分:14)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

实际上在SQL中,join-on语句可以用from-where语句编写(如果你真的想要)。但是你知道我们在SQL语句中有left join left outer join等等,这使我们更容易表达我们想要的东西(当然你也可以使用from-where但它会让你的代码变得疯狂)。因此,如果我们想要过滤结果,我们总是使用where,如果表之间存在关系,则使用join

答案 4 :(得分:0)

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

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

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

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

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