我一直在阅读在Microsoft .NET Framework 4中编写Microsoft LINQ ,现在我理解LINQ中的join
子句,但我对它的定义有疑问或质疑;在书中它被定义为:
您只能使用与
equals
运算符不同的特殊==
关键字来定义相等比较,因为操作数的位置很重要。对于equals
,左键消耗外部源序列,右键消耗内部源序列。外部源序列仅在equals
的左侧范围内,而内部源序列仅在右侧的范围内。
还有关于此运算符的正式定义:
join-clause ::= join innerItem in innerSequence on outerKey equals innerKey
请问,有人可以用其他话语或通过解释来解释我的上述概念吗?
答案 0 :(得分:10)
我想这是因为连接中的'equals'不像==那样工作,所以语言设计师决定不调用它做同样的事情。
在C#中,有一种给定a == b与b == a完全相同。在连接的定义中,情况并非如此:
var list = from a in ctx.TableA
join b from ctx.TableB on a.Id equals b.tableAId
以上这个是有效的。
var list = from a in ctx.TableA
join b from ctx.TableB on b.tableAId equals a.Id
这不会编译。语言规范说的是必须首先指定'外部'表(在本例中为TableA),而内部表(TableB)必须是第二个。我认为语言设计者认为这与==的工作方式有很大的不同,使用它并不是一个坏主意,他们想出了使用'等于'的想法。
我想我可能是对的,但只有所涉及的语言设计师才能真正了解真相。