2010-09-15 50 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)中,如果您問第一個問題,那麼它會執行什麼操作,並且您會看到顯着的性能下降。