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;
与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