クエリ式では、常に匿名型を作成する必要があるわけではありません。可能な場合は、既存の型を使用して列データを保持します。これは、クエリでデータ ソースからレコード全体が返された、または各レコードから 1 つのフィールドだけが返された場合に発生します。次のコード例では、customers は、Customer クラスのオブジェクトのコレクションです。このクラスには多くのプロパティがあり、その中の 1 つ以上を、任意の順序でクエリ結果に含めることができます。最初の 2 つの例では、クエリで名前付きの型の要素が選択されるため、匿名型は必要ありません。
ただし、適切な名前付きの型を常に使用できるとは限りません。ある目的のために顧客と住所を、別の目的で顧客 ID と所在地を、さらに別の目的で顧客名、住所、および注文履歴を選択する必要があるとします。匿名型を使用すると、結果を保持するための新しい名前付きの型を先に宣言しなくても、任意のプロパティを任意の順序で組み合わせて選択できます。プロパティのコンパイルのたびに、コンパイラによって匿名型が作成されます。次のクエリでは、customers 内の各 Customer オブジェクトから、顧客の名前と ID 番号だけを選択します。したがって、コンパイラは、これら 2 つのプロパティだけを格納する匿名型を作成します。
Dim custs3 = From cust In customers _
Select cust.Name, cust.ID
匿名型のプロパティの名前とデータ型は、両方とも、Select の引数である cust.Name と cust.ID から取得されます。クエリによって作成される匿名型のプロパティは、常に主要なプロパティになります。次の For Each ループの中で custs3 が実行された場合、結果は、Name と ID という 2 つの主要なプロパティを持つ匿名型のインスタンスのコレクションになります。
For Each selectedCust In custs3
Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next
custs3 で表されるコレクション内の要素は厳密に型指定されるので、IntelliSense を使用して、使用可能なプロパティのナビゲーションとそれらの型の検証を実行できます。
詳細については、「Visual Basic における LINQ の概要」を参照してください。