2011-03-07 65 views
5

在做Linq中的聯接如什麼在LINQ左側,等號右邊的區別加入

from c in customers join x in somelistofcustomers on x.Id equals c.Id

,你會得到錯誤

x是不在'等於'左側的範圍內。考慮交換對兩邊的表達式「等於」

很簡單的事,但我想澄清爲什麼x是不在範圍內左側,但不知何故,在範圍上的equals右側

回答

8

這是關於LINQ由編譯器擴展到底層擴展方法的方式。

您的查詢被翻譯成:

customers.Join(somelistofcustomers, c => x.Id, x => c.Id, (c, x) => ...) 

兩個lambda表達式c => x.Id & x => c.Id顯然有自己的局部變量超出範圍。由於LINQ在實際調用時只是一個很好的糖衣,編譯器正確地抱怨變量超出了範圍。

2

這只是一個慣例,基本結構的連接是如下

from identifier in {outer-sequence} 
join identifier2 in {inner-sequence} 
on {outer-key-selector} equals {inner-key-selector} 

identifier{outer-key-selector}是成對的,所以是identifier2{inner-key-selector} - 你不能切換奧德r,因爲它們的位置在連接語法中是固定的。

相關問題