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

本文关键字:子句 一部分 join Let | 更新日期: 2023-09-27 18:08:24

为什么可以这样使用:

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文档缺少一些细节。

更新:我只是试图使表达式更清晰可读。在我的情况下,我有一些方法链,我想把它们放在let clause上。否则,连接子句就会变得过于庞大。由于不可能使用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;

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

SelectMany不同,Join子句不能依赖于其他范围变量的"当前"值-因此这将工作:

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

…但是join不会。

如果你能详细说明你在做什么,我们也许能帮上更多的忙。

当然join是在let之前求值的…

这是MSDN上的博客条目更详细地解释了这一点- http://blogs.msdn.com/b/wesdyer/archive/2007/01/03/how-linq-to-objects-queries-work.aspx