Select 句 (Visual Basic)
更新 : 2007 年 11 月
クエリの結果を定義します。
Select [ var1 = ] fieldName1 [, [ var2 = ] fieldName2 [...] ]
指定項目
var1
省略可能です。列の式の結果を参照するために使用できるエイリアスです。fieldName1
必ず指定します。クエリ結果内の結果を返すフィールドの名前です。
解説
Select 句を使用して、クエリから返される結果を定義できます。これにより、クエリで作成される新しい匿名型のメンバを定義するか、またはクエリで返される名前付きの型のメンバを対象にできます。Select 句は、クエリでは必須ではありません。Select 句の指定がない場合、クエリは、現在のスコープで識別される範囲変数のすべてのメンバに基づく型を返します。詳細については、「匿名型」を参照してください。クエリで名前付きの型が作成される場合は、IEnumerable<T> 型の結果が返されます。T は作成された型を表します。
Select 句では、現在のスコープ内の任意の変数を参照できます。これには、From 句 (または複数の From 句) で識別される範囲変数も含まれます。さらに、Aggregate 句、Let 句、Group By 句、または Group Join 句によってエイリアスを使用して作成された新しい変数と、クエリ式で前の位置に出現する Select 句の変数も含まれます。Select 句には、静的な値を含めることもできます。たとえば、次のコード例は、Select 句でクエリ結果を新しい匿名型として定義するクエリ式を示しています。この匿名型には、ProductName、Price、Discount、および DiscountedPrice という 4 つのメンバがあります。ProductName メンバと Price メンバの値は、From 句で定義される製品の範囲変数から取得されます。DiscountedPrice メンバの値は、Let 句で計算されます。Discount メンバは静的な値です。
' 10% discount
Dim discount_10 = 0.1
Dim priceList = _
From product In products _
Let DiscountedPrice = product.UnitPrice * (1 - discount_10) _
Select product.ProductName, Price = product.UnitPrice, _
Discount = discount_10, DiscountedPrice
Select 句は、以降のクエリ句のために新しい範囲変数セットを導入します。前の範囲変数はスコープ外になります。クエリの戻り値は、クエリ式の最後の Select 句によって決定されます。たとえば、次のクエリでは、合計が 500 を超えるすべての注文について、会社名と注文 ID を返します。最初の Select 句は、Where 句と 2 番目の Select 句の範囲変数を識別します。2 番目の Select 句は、このクエリで返される値を、新しい匿名型として識別します。
Dim customerList = From cust In customers, ord In cust.Orders _
Select Name = cust.CompanyName, _
Total = ord.Total, ord.OrderID _
Where Total > 500 _
Select Name, OrderID
単一の項目を返すことが Select 句で識別された場合、クエリ式は、その単一の項目の型のコレクションを返します。複数の項目を返すことが Select 句で識別された場合、クエリ式は、選択された項目に基づいて、新しい匿名型のコレクションを返します。たとえば、次の 2 つのクエリでは、Select 句に基づいて、2 つの異なる型のコレクションが返されます。最初のクエリでは、会社名を表す文字列のコレクションが返されます。2 番目のクエリでは、会社名と住所の情報が格納された Customer オブジェクトのコレクションが返されます。
Dim customerNames = From cust In customers _
Select cust.CompanyName
Dim customerInfo As IEnumerable(Of Customer) = _
From cust In customers _
Select New Customer With {.CompanyName = cust.CompanyName, _
.Address = cust.Address, _
.City = cust.City, _
.Region = cust.Region, _
.Country = cust.Country}
使用例
次のクエリ式では、From 句を使用して、customers コレクションの範囲変数 cust を宣言します。Select 句は、顧客名と ID 値を選択し、新しい範囲変数の Name 列と ID 列に値を格納します。For Each ステートメントを使用して、返された各オブジェクトをループで処理し、各レコードの Name 列と ID 列を表示します。
Sub SelectCustomerNameAndId(ByVal customers() As Customer)
Dim nameIds = From cust In customers _
Select cust.CompanyName, cust.CustomerID
For Each nameId In nameIds
Console.WriteLine(nameId.CompanyName & ": " & nameId.CustomerID)
Next
End Sub