2009-07-14 48 views
34

我總是想知道爲什麼在linq連接中有一個equals關鍵字,而不是使用==運算符。Linq:在連接中==和equals有什麼區別?

Property deadline = 
(from p in properties 
join w in widgets 
    on p.WidgetID equals w.ID 
select p).First(); 

代替

Property deadline = 
(from p in properties 
join w in widgets 
    on p.WidgetID == w.ID 
select p).First(); 

[編輯]改述的問題並修改了的例子。

回答

38

有一個很好的解釋由馬特·沃倫在The Moth

「的原因C#有詞‘等於’,而不是‘==’經營者要清楚的是,‘上’條款的需求您提供了兩個單獨的表達式,它們的相等性不是單個謂詞表達式進行比較。從連接模式映射到Enumerable.Join()標準查詢運算符,該運算符指定兩個單獨的委託,用於計算可以進行比較的值。它需要它們作爲單獨的委託來構建一個查找表,並且使用另一個查詢表來查找查詢表。像SQL這樣的完整查詢處理器可以自由地檢查單個謂詞表達式並選擇它正在處理它。然而,爲了使LINQ操作類似於SQL需要連接條件總是被指定爲一個表達式樹,很簡單的內存對象情況下,顯著的開銷。」

然而,這涉及join。I」不能確定equals應該在你的代碼示例使用(它甚至不能編譯?)。

+1

你說得對,它甚至沒有編譯,我的壞!我用==和equals來解決問題已經有一段時間了,但是我認爲它是在我意外地使用==時發生了連接。無論如何,謝謝你的解釋! – 2009-07-14 07:24:37

15

你的第一個版本不編譯。你只使用equals加入,使等值連接的單獨半清楚編譯器。

+0

是的......第一個很好。 – 2009-07-14 07:22:06

相關問題