这个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文档的链接都将不胜感激。
答案 0 :(得分:15)
区别在于第1个显式创建了匿名类型。第二个是查询表达式,可以使用现有类型而不是创建匿名类型。来自Cameron MacFarland链接的文档:
查询表达式并不总是需要创建匿名类型。如果可能,他们使用现有类型来保存列数据。当查询从数据源返回整个记录时,或者每个记录只返回一个字段时,会发生这种情况。
答案 1 :(得分:2)
我的理解是没有区别。
New With
旨在用于
Dim X = New With { .Surname = "A", .Forename = "B" }
特别是对于Linq查询,您可以跳过New With
,但它仍适用于其他情况。但是,我不确定,因为我不知道VB 9:)
答案 2 :(得分:2)
您列出的两段代码之间没有功能差异。在引擎盖下,两个代码将使用匿名类型从查询返回数据。
第一段代码仅仅使用匿名类型显式。允许此语法的原因是可以从Select子句返回任何类型。但必须明确使用该类型。
Dim x = From it in SomeCollection Select New Student With { .Name = it.Name }
Joel在他的陈述中错误地认为第二个查询可能使用现有类型。如果没有显式类型,则使用显式属性名称的select子句将始终返回匿名类型。
答案 3 :(得分:1)
答案 4 :(得分:1)
没有区别。编译器将推断匿名类型。
您很可能希望返回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
然后你可以通过使用New来改变第一个查询以产生IQueryable(Of Employee)
而不是匿名类型......就像这样:
Dim ee = From e In someXML.<Employee> _
Select New Employee With {.Surname = e.<Surname>.Value, _
.Forename = e.<Forename>.Value}
答案 5 :(得分:0)
一个区别是匿名类型不可序列化。