LINQ中Equals和=之间有什么区别?

时间:2010-06-10 21:01:51

标签: vb.net linq

LINQ中等于 = 有什么区别?

Dim list As List(Of Foo) = (From a As Foo In FooList _
Join b As Bar In BarList _
On a.Something = b.Something _
Select a).ToList()

Dim list As List(Of Foo) = (From a As Foo In FooList _
Join b As Bar In BarList _
On a.Something Equals b.Something _
Select a).ToList()

2 个答案:

答案 0 :(得分:5)

来自引用马特沃伦的The Moth

  

“C#有'等于'这个词的原因   而不是'=='运算符   明确说明'on'条款   需要你提供两个单独的   比较的表达式   平等不是一个谓词   表达。从连接模式映射   到Enumerable.Join()标准   查询运算符,指定两个   单独的代表   然后计算可以的值   相比较。它需要它们分开   委托以构建查找   表与一个和探测到   查找表与另一个。满满的   像SQL这样的查询处理器是免费的   检查单个谓词表达式   并选择它将如何处理   它。然而,要使LINQ运行类似   SQL需要连接   条件总是指定为   表达树,一个重要的   简单的内存中的开销   对象案例。“

修改

后面的文章。

更新:Visual Basic团队的Vladimir Sadov告诉我,VB也使用Equals的原因基本相同。

答案 1 :(得分:1)

不同之处在于第二个版本将编译而第一个版本不会编译。 VB查询语法要求在以这种方式比较LINQ查询中的项时使用上下文关键字Equals

此运算符的工作方式在VB语言规范的第11.21.5节中定义

  • 两个表达式必须归类为值。
  • 两个表达式必须至少引用一个范围变量。
  • 连接查询运算符中声明的范围变量必须由其中一个表达式引用,并且该表达式不得引用任何其他范围变量。
  • 如果两个表达式的类型不完全相同,那么
    • 如果为两种类型定义了相等运算符,则两个表达式都可以隐式转换为它,并且它不是Object,然后将两个表达式转换为该类型。
    • 否则,如果存在可以隐式转换为两个表达式的显性类型,则将两个表达式转换为该类型。
    • 否则,发生编译时错误。