【问题标题】:Let clause as part of join clause让子句作为连接子句的一部分
【发布时间】:2011-09-12 09:30:11
【问题描述】:

为什么可以使用这个:

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。否则,连接子句变得太可怕了。由于无法使用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;

【问题讨论】:

  • 在我的回答中查看 msdn 博客链接......他们解释得很好......

标签: c# .net linq join


【解决方案1】:

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 clause的限制吗?
  • @Dmitry: 与其说是对let 子句的限制,不如说是对join 子句的限制——在连接情况下,Enumerable.Range 被称为一次 对于整个查询,而使用let 时,每个r1 的元素都会调用*一次。
【解决方案2】:

AFAIK joinlet 之前被评估...

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

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多