2009-07-14 86 views
34

我总是想知道为什么在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(); 

[编辑]改述的问题并修改了的例子。

回答

38

有一个很好的解释由马特·沃伦在The Moth

“的原因C#有词‘等于’,而不是‘==’经营者要清楚的是,‘上’条款的需求您提供了两个单独的表达式,它们的相等性不是单个谓词表达式进行比较。从连接模式映射到Enumerable.Join()标准查询运算符,该运算符指定两个单独的委托,用于计算可以进行比较的值。它需要它们作为单独的委托来构建一个查找表,并且使用另一个查询表来查找查询表。像SQL这样的完整查询处理器可以自由地检查单个谓词表达式并选择它正在处理它。然而,为了使LINQ操作类似于SQL需要连接条件总是被指定为一个表达式树,很简单的内存对象情况下,显著的开销。”

然而,这涉及join。I”不能确定equals应该在你的代码示例使用(它甚至不能编译?)。

+1

你说得对,它甚至没有编译,我的坏!我用==和equals来解决问题已经有一段时间了,但是我认为它是在我意外地使用==时发生了连接。无论如何,谢谢你的解释! – 2009-07-14 07:24:37

15

你的第一个版本不编译。你只使用equals加入,使等值连接的单独半清楚编译器。

+0

是的......第一个很好。 – 2009-07-14 07:22:06

相关问题