このVB Linqクエリの次の2つのバージョンの結果の違いは(もしあれば)何ですか?
'他の場所で定義された従業員の詳細を含む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ドキュメントへのリンクをいただければ幸いです。
違いは、1番目が明示的に匿名型を作成することです。 2番目はクエリ式であり、匿名型を作成するのではなく、既存の型を使用する場合があります。 Cameron MacFarlandによってリンクされたドキュメントから:
クエリ式では、必ずしも匿名型を作成する必要はありません。可能な場合は、既存のタイプを使用して列データを保持します。これは、クエリがデータソースからレコード全体を返すか、各レコードから1つのフィールドのみを返す場合に発生します。
私の理解では、違いはありません。
New With
は、次のようなクエリ外の使用を目的としています。
Dim X = New With { .Surname = "A", .Forename = "B" }
特にLinqクエリの場合、New With
をスキップできますが、それでも他の状況では役立ちます。ただし、わからないのでわかりませんVB 9 :)
リストした2つのコードの間に機能的な違いはありません。内部的には、両方の部分のコードは匿名型を使用してクエリからデータを返します。
最初のコードは、匿名型を明示的に使用するだけです。この構文が許可されている理由は、Select句から任意の型を返すことができるためです。ただし、型は明示的に使用する必要があります。
Dim x = From it in SomeCollection Select New Student With { .Name = it.Name }
Joelは、2番目のクエリが既存の型を使用する可能性があるという彼のステートメントの誤りです。明示的な型がない場合、明示的なプロパティ名を使用するselect句は、常に匿名型を返します。
違いはありません。コンパイラは匿名型を推測します。
XElementの代わりにStringを返す_e.<Surname>.Value
_のように、要素の値を返したいと思うでしょう。
2番目の例は次のように簡略化できます
_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}
_
それらは 匿名タイプ と呼ばれます。
それらを使用する主な理由は、クエリからのデータを単一のオブジェクトに保持することです。これにより、イテレータはオブジェクトのリストを繰り返し処理し続けることができます。
これらは、大規模またはマルチパートのLINQクエリの途中でストレージの一時的な型として機能する傾向があります。
1つの違いは、匿名型はシリアル化できないことです。