将子句作为join子句的一部分

时间:2011-09-12 09:30:12

标签: c# .net linq join

为什么可以使用它:

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;

let clause上的MSDN documentation缺少一些细节。

更新 我只是试着让表达更清晰可读。在我的情况下,我有一些方法链接,我想把它放到let clause。否则,join子句变得太可怕了。因为不可能使用let clause(如Jon所提到的)我引入了外部变量,这里:

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

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

2 个答案:

答案 0 :(得分: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;

...但是加入不会。

如果你能详细说明你想要做什么,我们可以提供更多帮助。

答案 1 :(得分:0)

AFAIK在join ...

之前评估let

以下是MSDN上的博客文章,解释了这一点 - http://blogs.msdn.com/b/wesdyer/archive/2007/01/03/how-linq-to-objects-queries-work.aspx