Visual Basic には、 Join
と Group Join
のクエリ句が用意されており、コレクション間の共通値に基づいて複数のコレクションの内容を結合できます。 これらの値は キー 値と呼ばれます。 リレーショナル データベースの概念に精通している開発者は、 Join
句を INNER JOIN として認識し、 Group Join
句を LEFT OUTER JOIN として効果的に認識します。
このトピックの例では、 Join
と Group Join
クエリ句を使用してデータを結合するいくつかの方法を示します。
プロジェクトの作成とサンプル データの追加
サンプル データと型を含むプロジェクトを作成するには
このトピックのサンプルを実行するには、Visual Studio を開き、新しい Visual Basic コンソール アプリケーション プロジェクトを追加します。 Visual Basic によって作成されたModule1.vb ファイルをダブルクリックします。
このトピックのサンプルでは、次のコード例の
Person
とPet
の型とデータを使用します。 このコードを、Visual Basic によって作成された既定のModule1
モジュールにコピーします。Private _people As List(Of Person) Private _pets As List(Of Pet) Function GetPeople() As List(Of Person) If _people Is Nothing Then CreateLists() Return _people End Function Function GetPets(ByVal people As List(Of Person)) As List(Of Pet) If _pets Is Nothing Then CreateLists() Return _pets End Function Private Sub CreateLists() Dim pers As Person _people = New List(Of Person) _pets = New List(Of Pet) pers = New Person With {.FirstName = "Magnus", .LastName = "Hedlund"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Daisy", .Owner = pers}) pers = New Person With {.FirstName = "Terry", .LastName = "Adams"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Barley", .Owner = pers}) _pets.Add(New Pet With {.Name = "Boots", .Owner = pers}) _pets.Add(New Pet With {.Name = "Blue Moon", .Owner = pers}) pers = New Person With {.FirstName = "Charlotte", .LastName = "Weiss"} _people.Add(pers) _pets.Add(New Pet With {.Name = "Whiskers", .Owner = pers}) ' Add a person with no pets for the sake of Join examples. _people.Add(New Person With {.FirstName = "Arlene", .LastName = "Huff"}) pers = New Person With {.FirstName = "Don", .LastName = "Hall"} ' Do not add person to people list for the sake of Join examples. _pets.Add(New Pet With {.Name = "Spot", .Owner = pers}) ' Add a pet with no owner for the sake of Join examples. _pets.Add(New Pet With {.Name = "Unknown", .Owner = New Person With {.FirstName = String.Empty, .LastName = String.Empty}}) End Sub
Class Person Public Property FirstName As String Public Property LastName As String End Class Class Pet Public Property Name As String Public Property Owner As Person End Class
Join 句を使用して内部結合を実行する
INNER JOIN は、2 つのコレクションのデータを結合します。 指定したキー値が一致する項目が含まれます。 一致する項目が他のコレクションにないいずれかのコレクションの項目は除外されます。
Visual Basic では、LINQ には、INNER JOIN を実行するための 2 つのオプション (暗黙的結合と明示的結合) が用意されています。
暗黙的な結合は、 From
句で結合するコレクションを指定し、 Where
句内の一致するキー フィールドを識別します。 Visual Basic は、指定されたキー フィールドに基づいて 2 つのコレクションを暗黙的に結合します。
結合で使用するキー フィールドを特定する場合は、 Join
句を使用して明示的な結合を指定できます。 この場合も、 Where
句を使用してクエリ結果をフィルター処理できます。
Join 句を使用して内部結合を実行するには
プロジェクトの
Module1
モジュールに次のコードを追加して、暗黙的な内部結合と明示的な内部結合の両方の例を確認します。Sub InnerJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Implicit Join. Dim petOwners = From pers In people, pet In pets Where pet.Owner Is pers Select pers.FirstName, PetName = pet.Name ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' Explicit Join. Dim petOwnersJoin = From pers In people Join pet In pets On pet.Owner Equals pers Select pers.FirstName, PetName = pet.Name ' Display grouped results. output = New System.Text.StringBuilder() For Each pers In petOwnersJoin output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' Both queries produce the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers End Sub
Group Join 句を使用して左外部結合を実行する
LEFT OUTER JOIN には、結合の左側のコレクションのすべての項目と、結合の右側のコレクションの一致する値のみが含まれます。 結合の右側のコレクションの項目のうち、左側のコレクションに一致する項目がない項目は、クエリ結果から除外されます。
Group Join
句は、実際には LEFT OUTER JOIN を実行します。 通常 LEFT OUTER JOIN と呼ばれるものの違いは、 Group Join
句が返す違いは、 Group Join
句が左側のコレクション内の各項目の結合の右側のコレクションから結果をグループ化することです。 リレーショナル データベースでは、LEFT OUTER JOIN はグループ化されていない結果を返します。この結果では、クエリ結果の各項目に結合内の両方のコレクションの一致する項目が含まれます。 この場合、結合の左側のコレクションの項目は、右側のコレクションの一致する項目ごとに繰り返されます。 次の手順を完了すると、このようになります。
グループ化されていない結果として Group Join
クエリの結果を取得するには、グループ化されていないクエリ結果ごとに項目を返すようにクエリを拡張します。 これを実現するには、グループ化されたコレクションの DefaultIfEmpty
メソッドに対してクエリを実行する必要があります。 これにより、結合の左側のコレクションの項目が、右側のコレクションの一致する結果がない場合でも、クエリ結果に含められます。 結合の右側のコレクションに一致する値がない場合に、既定の結果値を提供するコードをクエリに追加できます。
Group Join 句を使用して左外部結合を実行するには
プロジェクトの
Module1
モジュールに次のコードを追加して、グループ化された左外部結合とグループ化されていない左外部結合の両方の例を確認します。Sub LeftOuterJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Grouped results. Dim petOwnersGrouped = From pers In people Group Join pet In pets On pers Equals pet.Owner Into PetList = Group Select pers.FirstName, pers.LastName, PetList ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwnersGrouped output.AppendFormat(pers.FirstName & ":" & vbCrLf) For Each pt In pers.PetList output.AppendFormat(vbTab & pt.Name & vbCrLf) Next Next Console.WriteLine(output) ' This code produces the following output: ' ' Magnus: ' Daisy ' Terry: ' Barley ' Boots ' Blue Moon ' Charlotte: ' Whiskers ' Arlene: ' "Flat" results. Dim petOwners = From pers In people Group Join pet In pets On pers Equals pet.Owner Into PetList = Group From pet In PetList.DefaultIfEmpty() Select pers.FirstName, pers.LastName, PetName = If(pet Is Nothing, String.Empty, pet.Name) ' Display "flat" results. output = New System.Text.StringBuilder() For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output.ToString()) ' This code produces the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers ' Arlene: End Sub
複合キーを使用して結合を実行する
Join
句または Group Join
句で And
キーワードを使用すると、結合するコレクションの値を照合するときに使用する複数のキー フィールドを識別できます。
And
キーワードは、指定したすべてのキー フィールドが、結合される項目と一致する必要があることを指定します。
複合キーを使用して結合を実行するには
次のコードをプロジェクトの
Module1
モジュールに追加して、複合キーを使用する結合の例を確認します。Sub CompositeKeyJoinExample() ' Create two lists. Dim people = GetPeople() Dim pets = GetPets(people) ' Implicit Join. Dim petOwners = From pers In people Join pet In pets On pet.Owner.FirstName Equals pers.FirstName And pet.Owner.LastName Equals pers.LastName Select pers.FirstName, PetName = pet.Name ' Display grouped results. Dim output As New System.Text.StringBuilder For Each pers In petOwners output.AppendFormat( pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf) Next Console.WriteLine(output) ' This code produces the following output: ' ' Magnus: Daisy ' Terry: Barley ' Terry: Boots ' Terry: Blue Moon ' Charlotte: Whiskers End Sub
コードを実行する
例を実行するコードを追加するには
プロジェクトの
Module1
モジュールのSub Main
を次のコードに置き換えて、このトピックの例を実行します。Sub Main() InnerJoinExample() LeftOuterJoinExample() CompositeKeyJoinExample() Console.ReadLine() End Sub
F5 キーを押して例を実行します。
こちらも参照ください
- LINQ
- Visual Basic での LINQ の概要
- Join 句
- Group Join 句
- From 句
- Where 句
- クエリ
- LINQ を使用したデータ変換 (C#)
.NET