39

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

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();

[编辑]改写了问题并修改了示例。

4

2 回答 2

43

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

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

然而,这令人担忧join。我不确定是否equals应该在您的代码示例中使用(它甚至可以编译吗?)。

于 2009-07-14T07:12:11.357 回答
17

您的第一个版本无法编译。您只能在连接中使用equals,以使编译器清楚地了解等值连接的不同部分。

于 2009-07-14T07:16:04.720 回答