2011-09-12 86 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'。 –

相关问题