19

此 VB Linq 查询的以下两个版本的结果之间有什么区别(如果有)?

' 假设我们有一个 XElement,其中包含在其他地方定义的员工详细信息

Dim ee = From e In someXML.<Employee> _
Select New With {.Surname = e.<Surname>, .Forename = e.<Forename>}

Dim ee = From e In someXML.<Employee> _
Select Surname = .Surname = e.<Surname>, .Forename = e.<Forename>

即新的意义是什么... 有语法?

我怀疑这有一个简单的答案,但我找不到它 - 任何指向合适教程或 Microsoft 文档的链接都将不胜感激。

4

6 回答 6

15

不同之处在于第一个显式创建了一个匿名类型。第二个是查询表达式,可以使用现有类型而不是创建匿名类型。从 Cameron MacFarland 链接的文档中:

查询表达式并不总是需要创建匿名类型。如果可能,他们使用现有类型来保存列数据。当查询返回数据源中的全部记录或每条记录仅返回一个字段时,就会发生这种情况。

于 2009-02-09T15:35:33.257 回答
3

我的理解是没有区别。

New With旨在查询外使用,例如

Dim X = New With { .Surname = "A", .Forename = "B" }

特别是对于 Linq 查询,你可以跳过New With,但它在其他情况下仍然有用。但是,我不确定,因为我不知道 VB 9 :)

于 2009-02-09T15:52:32.810 回答
2

您列出的两段代码之间没有功能差异。在后台,这两段代码都将使用匿名类型从查询中返回数据。

第一段代码只是显式地使用了匿名类型。允许使用此语法的原因是可以从 Select 子句返回任何类型。但是类型必须显式使用。

Dim x = From it in SomeCollection Select New Student With { .Name = it.Name }

Joel 在他关于第二个查询可能使用现有类型的陈述中是不正确的。如果没有显式类型,则使用显式属性名称的 select 子句将始终返回匿名类型。

于 2009-02-09T16:19:49.190 回答
1

它们被称为匿名类型

使用它们的主要原因是将查询中的数据保存在单个对象中,因此迭代器可以继续迭代对象列表。

它们倾向于在大型或多部分 LINQ 查询中用作临时存储类型。

于 2009-02-09T15:30:12.273 回答
1

没有区别。编译器将推断匿名类型。

您很可能希望像 in 一样返回元素的值e.<Surname>.Value,它返回 String 而不是 XElement。

您的第二个示例可以简化为

Dim ee = From e In someXML.<Employee> _
         Select e.<Surname>.Value, e.<Forename>.Value

因为编译器还会推断匿名类型成员的名称。

但是,如果您有以下课程

Class Employee

    Private _surname As String
    Public Property Surname() As String
        Get
            Return _surname
        End Get
        Set(ByVal value As String)
            _surname = value
        End Set
    End Property

    Private _forename As String
    Public Property Forename() As String
        Get
            Return _forename
        End Get
        Set(ByVal value As String)
            _forename = value
        End Set
    End Property

End Class

IQueryable(Of Employee)然后,您可以使用 New ...更改第一个查询以生成一个而不是匿名类型,如下所示:

Dim ee = From e In someXML.<Employee> _
         Select New Employee With {.Surname = e.<Surname>.Value, _
                                   .Forename = e.<Forename>.Value}
于 2009-05-15T03:32:35.497 回答
0

一个区别是匿名类型不可序列化。

于 2009-02-09T15:56:20.027 回答