我总是想知道为什么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();
[编辑] 重新提出问题并修改了示例。
答案 0 :(得分:41)
马特沃伦在The Moth处有一个很好的解释:
“C#具有'等于'而不是'=='运算符的原因是要明确'on'子句需要提供两个单独的表达式,这些表达式是相等而不是单个谓词表达式进行比较。 from-join模式映射到Enumerable.Join()标准查询运算符,该运算符指定两个单独的委托,用于计算可以比较的值。它需要它们作为单独的委托,以便构建一个查询表和一个探针像SQL一样的完整查询处理器可以自由地检查单个谓词表达式并选择它将如何处理它。然而,要使LINQ操作类似于SQL,需要始终指定连接条件。作为表达式树,这是简单的内存中对象案例的重要开销。“
然而,这涉及join
。我不确定你的代码示例中应该使用equals
(它甚至可以编译吗?)。
答案 1 :(得分:16)
您的第一个版本无法编译。 仅在连接中使用equals
,以使编译器的单独一半清晰可见。