Linq:在连接中==和equals有什么区别?
我总是想知道为什么在linq连接中有一个equals
关键字,而不是使用==操作符。
Property deadline = (from p in properties join w in widgets on p.WidgetID equals w.ID select p).First();
代替
Property deadline = (from p in properties join w in widgets on p.WidgetID == w.ID select p).First();
[编辑]改写了这个问题,并修改了例子。
蛾的马特·沃伦有一个很好的解释:
“C#中有'equals'这个词的原因是为了明确'on'这个子句需要你提供两个独立的expression式,这些expression式不仅仅是一个谓词expression式,将模式映射连接到Enumerable.Join()标准查询运算符,该运算符指定两个单独的委托,用于计算可以进行比较的值。它需要它们作为单独的委托来构build查找表,并查找查找一个完整的查询处理器(如SQL)可以自由地检查单个谓词expression式并select它将如何处理它,但是为了使LINQ的操作类似于SQL,需要连接条件总是被指定为一个expression式树,这是简单的内存中对象情况的一个重要开销。“
但是,这关系到join
。 我不知道你的代码示例中是否应该使用equals
(它甚至可以编译?)。
你的第一个版本不能编译。 你只在连接中使用equals
,以便使编译器对等连接的两半分开。