2010-09-15 45 views
11

是他们似乎给了我同样的结果where和join有什么区别?

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

之间的差异。

+1

它与SQL隐式与显式连接相同。两者都是联结,但第二个是明确的。 – spender 2010-09-15 07:42:37

+0

这是'任何适合你' - 哈看看我在那里做了什么 – PostMan 2010-09-15 07:48:25

回答

14

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

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

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

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

1

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

WHERE子句指定SQL(数据操作语言)语句只应该影响符合指定条件的行(将WHERE子句看作FILTER)。

+0

根本不回答我的问题:( – 2010-09-15 07:52:34

+0

啊,LINQ查询的语义与ANSI SQL查询的语义不同(wrt WHERE和JOIN)吗? – 2010-09-15 08:02:17

+0

当然,即使在一个SQL查询中,这个问题也没有回答这个问题,你说“一个JOIN是一个用于组合两个表的字段的方法”,但是肯定也是从a,b where a.Field = b.Field, – Timwi 2010-09-15 08:37:47

0

在实践中,取决于许多其他因素,您可以通过使用另一个因素来获得性能提升。我可以想象(尽管我对此没有任何基础),连接比WHERE子句更可靠。

编辑:原来我完全错了。这两种类型之间的表现应该没有差异。然而,更新的样式(使用JOIN)更清晰地阅读(imo),而且微软也表示他们将不会支持旧样式(使用WHERE的外连接)。

0

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

0

的第一个查询是说,实际上,“请在这些集合(创建essensially一个N×M的矩阵)一个交叉连接,然后只需要那些沿对角线,并给我吧”

的第二个查询实际上是“仅创建proeprties匹配的组合项目的列表”。

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

由于SQL数据库通常是高度优化的,所以当您询问第一个时,服务器只会说“Idiot user ....”,并用第二个替代。

在非SQL环境(如Linq-to-Objects)中,如果您问第一个问题,那么它会执行什么操作,并且您会看到显着的性能下降。