2011-09-12 61 views
0

的一部分:Let子句因爲它爲什麼可以使用此連接語句

from r1 in Enumerable.Range(1, 10) 
join q1 in Enumerable.Range(1, 20) on r1 equals q1 
select r1; 

,但無法使用此:

from r1 in Enumerable.Range(1, 10) 
let q = Enumerable.Range(1, 20) 
join q1 in q on r1 equals q1 
select r1; 

MSDN documentationlet clause缺少一些細節。

更新: 我只是試圖讓表達式更清晰可讀。在我的情況下,我想用一些方法鏈接let clause。否則,加入條款變得太可怕了。因爲它是不可能使用let clause(如喬恩提及)我介紹了外部變量,在這裏:

IEnumerable<int> q = Enumerable.Range(1, 10); 

from r1 in Enumerable.Range(1, 10) 
join q1 in q on r1 equals q1 
select r1; 
+0

看到我的答案中的MSDN博客鏈接...他們解釋它很不錯... – Yahia

回答

3

不像SelectMany,一個Join子句可以不依賴於其他範圍變量的「當前」價值 - 所以這將工作:

from r1 in Enumerable.Range(1, 10) 
let q = Enumerable.Range(1, 20) 
from q1 in q where r1 == q1 
select r1; 

...但加入不會。

如果您可以詳細說明您正在嘗試做什麼,那麼我們可能會提供更多幫助。

+0

我已經更新瞭解決方案的問題,因爲它是不可能使用'let'。但是,你能解釋一下關於'let子句'的限制嗎? –

+0

@Dmitry:它並不是對'let'子句的限制作爲對join子句的限制 - 在連接的情況下,對於整個查詢,Enumerable.Range被調用* once *,而使用'let '它會被稱爲*每個元素的'r1'。 –

相關問題