2009-10-25 49 views

回答

10

連接中的平等兩邊被視爲兩個單獨的lambda表達式,這兩個lambda表達式爲兩個序列生成密鑰。

from category in categories 
join prod in products on category.ID equals prod.CategoryID 

categories.Join(products, 
       category => category.ID, 
       prod => prod.CategoryID, 
       (category, prod) => new { Category = category, Product=prod }); 

使用equals關鍵字使得它在一個lambda結束而另一個開始的地方是不明確的。對於where子句,在另一方面,有一個單一的lambda表達式這決定每個項目是否匹配:

from prod in products 
where prod.CategoryID == 1 

products.Where(prod => prod.CategoryID == 1) 

從理論上講,聯接可能已經有一個拉姆達實現

from category in categories 
join prod in products on category.ID == prod.CategoryID 

categories.Join(products, 
       (category, prod) => category.ID == prod.CategoryID, 
       (category, prod) => new { Category = category, Product=prod }); 

然而通過計算兩個鍵並自己進行比較,LINQ可以使用散列表來更有效地計算連接,而不是爲每對元素執行任意比較。

6

你將不得不問設計師,但很明顯允許任何(布爾)表達式將允許太多的可能性。使用像equals這樣的特殊關鍵字可以更容易地將它限定爲2個適當的列。

我在The Moth找到了一個討論。

+1

這很有道理。 – ProfK 2009-10-25 11:10:21