web-dev-qa-db-ja.com

「New ... With」構文はVB Linqで何をしますか?

この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ドキュメントへのリンクをいただければ幸いです。

18
Steve Davies

違いは、1番目が明示的に匿名型を作成することです。 2番目はクエリ式であり、匿名型を作成するのではなく、既存の型を使用する場合があります。 Cameron MacFarlandによってリンクされたドキュメントから:

クエリ式では、必ずしも匿名型を作成する必要はありません。可能な場合は、既存のタイプを使用して列データを保持します。これは、クエリがデータソースからレコード全体を返すか、各レコードから1つのフィールドのみを返す場合に発生します。

15
Joel Coehoorn

私の理解では、違いはありません。

New Withは、次のようなクエリ外の使用を目的としています。

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

特にLinqクエリの場合、New Withをスキップできますが、それでも他の状況では役立ちます。ただし、わからないのでわかりませんVB 9 :)

2
Andrey Shchekin

リストした2つのコードの間に機能的な違いはありません。内部的には、両方の部分のコードは匿名型を使用してクエリからデータを返します。

最初のコードは、匿名型を明示的に使用するだけです。この構文が許可されている理由は、Select句から任意の型を返すことができるためです。ただし、型は明示的に使用する必要があります。

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

Joelは、2番目のクエリが既存の型を使用する可能性があるという彼のステートメントの誤りです。明示的な型がない場合、明示的なプロパティ名を使用するselect句は、常に匿名型を返します。

2
JaredPar

違いはありません。コンパイラは匿名型を推測します。

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}
_
1
CoderDennis

それらは 匿名タイプ と呼ばれます。

それらを使用する主な理由は、クエリからのデータを単一のオブジェクトに保持することです。これにより、イテレータはオブジェクトのリストを繰り返し処理し続けることができます。

これらは、大規模またはマルチパートのLINQクエリの途中でストレージの一時的な型として機能する傾向があります。

1

1つの違いは、匿名型はシリアル化できないことです。

0
Shawn