在linq连接中,equals的左侧和右侧之间有什么区别

时间:2011-03-07 00:59:25

标签: linq

在Linq中进行加入时,例如

from c in customers join x in somelistofcustomers on x.Id equals c.Id

你会收到错误

  

x不在'equals'左侧的范围内。考虑交换'equals'

两侧的表达式

很简单,但是我想澄清一下为什么x不在左侧的范围内,但不知何故在equals右侧的范围内

2 个答案:

答案 0 :(得分:8)

这与LINQ由编译器扩展到底层扩展方法的方式有关。

您的查询正在翻译成:

customers.Join(somelistofcustomers, c => x.Id, x => c.Id, (c, x) => ...)

两个lambda表达式c => x.Id& x => c.Id明显将其局部变量超出范围。由于LINQ在实际调用中只是一个很好的糖涂层,编译器会正确地抱怨变量超出了范围。

答案 1 :(得分:2)

这只是一个约定,基本上连接的结构如下

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}也是如此 - 您无法切换顺序,因为它们的位置在连接语法中是固定的。