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

C# Let子句作为join子句的一部分,c#,.net,linq,join,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; 但不可能使用此选项: from r1 in Enumerable

为什么可以使用此选项:

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;
但不可能使用此选项:

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;
on
let子句
缺少一些细节

更新: 我只是想让这个表达更清晰易读。在我的情况下,我有一些方法链接到
let子句
。否则join子句就变得太可怕了。由于无法使用
let子句
(如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;
IEnumerable q=可枚举范围(1,10);
从可枚举范围(1,10)中的r1开始
在r1上的q中加入q1等于q1
选择r1;

AFAIK在
let
之前对
连接进行评估


下面是MSDN上的一篇博客文章,解释了这一更为详细的问题-

AFAIK在
let
之前对
join
进行评估


下面是MSDN上的一篇博客文章,解释了这一更为详细的解释-

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

from r1 in Enumerable.Range(1, 10)
let q = Enumerable.Range(1, 20)
from q1 in q where r1 == 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;
。。。但加入不会


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

我已经用适合我的解决方案更新了问题,因为无法使用
let
。但是你能解释一下对
let子句
的限制吗?@Dmitry:与其说是对
let
子句的限制,不如说是对
join
子句的限制-在join的情况下,
Enumerable.Range对整个查询调用一次,而使用
let
则会对
r1
的每个元素调用*一次。我已经用适合我的解决方案更新了这个问题,因为无法使用
let
。但是你能解释一下对
let子句
的限制吗?@Dmitry:与其说是对
let
子句的限制,不如说是对
join
子句的限制-在join的情况下,
Enumerable.Range对整个查询调用一次,而使用
let
则会对
r1
的每个元素调用*一次。请参阅我答案中的msdn博客链接。。。他们解释得很好…请参阅我答案中的msdn博客链接。。。他们解释得很好。。。