Linq:连接中==和equals有什么区别?

Mic*_*ent 38 c# linq join equals

我总是想知道为什么equalslinq连接中有一个关键字而不是使用==运算符.

Property deadline =
(from p in properties
 join w in widgets
    on p.WidgetID equals w.ID
 select p).First();
Run Code Online (Sandbox Code Playgroud)

代替

Property deadline =
(from p in properties
 join w in widgets
    on p.WidgetID == w.ID
 select p).First();
Run Code Online (Sandbox Code Playgroud)

[编辑]重新提出问题并修改了示例.

Kon*_*lph 42

Matt Warren在The Moth有一个很好的解释:

"C#有'等于'而不是'=='运算符的原因是要明确'on'子句需要你提供两个单独的表达式,这些表达式被比较为相等而不是单个谓词表达式.将模式映射连接到Enumerable.Join()标准查询运算符,该运算符指定两个单独的委托,用于计算可以比较的值.它需要它们作为单独的委托,以便构建一个查找表,并查询查找像SQL这样的完整查询处理器可以自由地检查单个谓词表达式并选择它将如何处理它.然而,要使LINQ操作类似于SQL,需要始终将连接条件指定为表达式树,这是简单的内存中对象案例的重要开销."

但是,这种担忧join.我不确定equals应该在你的代码示例中使用它(它甚至可以编译吗?).


Jon*_*eet 17

您的第一个版本无法编译.您只能equals在连接中使用,以使编译器清除equijoin的单独一半.

  • @StephenHolt:不,在查询表达式中执行`join`时,总是需要使用`equals`.这是语法的一部分. (3认同)