このトピックでは、Visual Basic の Language-Integrated クエリ (LINQ) 式と、クエリで実行する一般的な操作の一部について簡単に説明します。 詳細については、次のトピックを参照してください。
Visual Basic での LINQ の概要
チュートリアル: Visual Basic でのクエリの記述
データ ソースの指定 (From)
LINQ クエリの最初の手順は、クエリを実行するデータ ソースを指定することです。 したがって、クエリの From
句が常に優先されます。 クエリ演算子は、ソースの種類に基づいて結果を選択して整形します。
Dim query = From cust In customers
' ...
From
句は、データ ソース、customers
、および範囲変数cust
を指定します。 範囲変数はループ反復変数に似ていますが、クエリ式では実際の反復は行われません。 多くの場合、 For Each
ループを使用してクエリを実行すると、範囲変数は、 customers
内の連続する各要素への参照として機能します。 コンパイラは cust
の型を推論できるため、明示的に指定する必要はありません。 明示的な型指定の有無にかかわらず記述されるクエリの例については、「 クエリ操作の型リレーションシップ (Visual Basic)」を参照してください。
Visual Basic で From
句を使用する方法の詳細については、「 From 句」を参照してください。
データのフィルター処理 (Where)
おそらく最も一般的なクエリ操作は、ブール式の形式でフィルターを適用することです。 その後、クエリは、式が true の要素のみを返します。 フィルター処理を実行するには、 Where
句を使用します。 フィルターは、結果のシーケンスに含めるデータ ソース内の要素を指定します。 次の例では、ロンドンに住所を持つ顧客のみが含まれています。
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
And
やOr
などの論理演算子を使用して、フィルター式をWhere
句に結合できます。 たとえば、ロンドン出身で、名前が Devon の顧客のみを返すには、次のコードを使用します。
Where cust.City = "London" And cust.Name = "Devon"
ロンドンまたはパリから顧客を返すには、次のコードを使用します。
Where cust.City = "London" Or cust.City = "Paris"
Visual Basic で Where
句を使用する方法の詳細については、「 Where 句」を参照してください。
データの並べ替え (並べ替え)
多くの場合、返されたデータを特定の順序に並べ替えるのが便利です。
Order By
句を指定すると、返されたシーケンス内の要素が、指定したフィールドで並べ替えられます。 たとえば、次のクエリは、 Name
プロパティに基づいて結果を並べ替えます。
Name
は文字列であるため、返されるデータはアルファベット順に A から Z に並べ替えられます。
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
結果を逆の順序で並べ替える場合は、Z から A まで、 Order By...Descending
句を使用します。 既定値は、Ascending
もDescending
も指定されていない場合にAscending
されます。
Visual Basic で Order By
句を使用する方法の詳細については、「 Order By 句」を参照してください。
データの選択 (選択)
Select
句は、返される要素の形式と内容を指定します。 たとえば、結果が完全な Customer
オブジェクト、1 つの Customer
プロパティ、プロパティのサブセット、さまざまなデータ ソースのプロパティの組み合わせ、または計算に基づく新しい結果の種類で構成されるかどうかを指定できます。
Select
句がソース要素のコピー以外のものを生成する場合、操作はプロジェクションと呼ばれます。
完全な Customer
オブジェクトで構成されるコレクションを取得するには、範囲変数自体を選択します。
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Customer
インスタンスが多数のフィールドを持つラージ オブジェクトであり、取得する必要があるのが名前の場合は、次の例に示すようにcust.Name
を選択できます。 ローカル型推論では、結果の型が Customer
オブジェクトのコレクションから文字列のコレクションに変更されることを認識します。
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
データ ソースから複数のフィールドを選択するには、次の 2 つの選択肢があります。
Select
句で、結果に含めるフィールドを指定します。 コンパイラは、それらのフィールドをプロパティとして持つ匿名型を定義します。 詳細については、「 匿名型」を参照してください。次の例で返される要素は匿名型のインスタンスであるため、コード内の別の場所で名前で型を参照することはできません。 型のコンパイラ指定名に、通常の Visual Basic コードでは無効な文字が含まれています。 次の例では、
londonCusts4
のクエリによって返されるコレクション内の要素は匿名型のインスタンスですDim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
-又は-
結果に含める特定のフィールドを含む名前付き型を定義し、
Select
句で型のインスタンスを作成および初期化します。 このオプションは、返されるコレクションの外部で個々の結果を使用する必要がある場合、またはメソッド呼び出しでパラメーターとして渡す必要がある場合にのみ使用します。 次の例のlondonCusts5
の種類は IEnumerable(Of NamePhone) です。Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
Visual Basic で Select
句を使用する方法の詳細については、「 Select 句」を参照してください。
データの結合 (結合とグループ結合)
From
句では、複数のデータ ソースを複数の方法で組み合わせることができます。 たとえば、次のコードは 2 つのデータ ソースを使用し、両方のプロパティを暗黙的に結果に結合します。 このクエリでは、姓が母音で始まる学生を選択します。
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
注
このコードは、「 方法: 項目のリストを作成する」で作成した学生のリストを使用して実行できます。
Join
キーワードは、SQL のINNER JOIN
と同じです。 2 つのコレクション内の要素間の一致するキー値に基づいて、2 つのコレクションを結合します。 クエリは、一致するキー値を持つコレクション要素のすべてまたは一部を返します。 たとえば、次のコードは、前の暗黙的結合のアクションを複製します。
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join
は、SQL の LEFT JOIN
と同様に、コレクションを 1 つの階層コレクションに結合します。 詳細については、「 Join 句 」および 「グループ結合句」を参照してください。
データのグループ化 (グループ化)
Group By
句を追加して、要素の 1 つ以上のフィールドに従ってクエリ結果の要素をグループ化できます。 たとえば、次のコードは、クラス年度別に学生をグループ化します。
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
「 方法: 項目のリストを作成する」で作成した学生のリストを使用してこのコードを実行すると、 For Each
ステートメントからの出力は次のようになります。
年: ジュニア
タッカー、マイケル
Garcia、Hugo
Garcia、Debra
タッカー、ランス
年: シニア
Omelchenko、スヴェトラナ
長田 美智子
Fakhouri、Fadi
Feng、Hanying
Adams、Terry
年: 新入生
Mortensen、Sven
ガルシア、セザール
次のコードに示すバリエーションは、クラスの年を並べ替え、各年度内の学生を姓で並べ替えます。
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
Group By
の詳細については、「グループ化句」を参照してください。
こちらも参照ください
.NET