【发布时间】:2011-03-07 00:59:25
【问题描述】:
当在 Linq 中加入时,例如
from c in customers join x in somelistofcustomers on x.Id equals c.Id
你会得到错误
x 不在“等于”左侧的范围内。考虑交换 'equals' 两边的表达式
做起来很简单,但我想澄清一下为什么 x 不在左侧的范围内,但不知何故在 equals 的右侧范围内
【问题讨论】:
标签: linq
当在 Linq 中加入时,例如
from c in customers join x in somelistofcustomers on x.Id equals c.Id
你会得到错误
x 不在“等于”左侧的范围内。考虑交换 'equals' 两边的表达式
做起来很简单,但我想澄清一下为什么 x 不在左侧的范围内,但不知何故在 equals 的右侧范围内
【问题讨论】:
标签: linq
这与编译器将 LINQ 扩展为底层扩展方法的方式有关。
您的查询正在被翻译成:
customers.Join(somelistofcustomers, c => x.Id, x => c.Id, (c, x) => ...)
c => x.Id 和 x => c.Id 这两个 lambda 表达式显然使它们的局部变量超出了范围。由于 LINQ 只是对实际调用的一个很好的糖衣,编译器会正确地抱怨变量超出范围。
【讨论】:
只是一个约定,基本上join的结构如下
from identifier in {outer-sequence}
join identifier2 in {inner-sequence}
on {outer-key-selector} equals {inner-key-selector}
identifier 和 {outer-key-selector} 是成对的,identifier2 和 {inner-key-selector} 也是成对的 - 你不能切换顺序,因为它们的位置在连接语法中是固定的。
【讨论】: