次の方法で共有


方法: 結合を使用して LINQ でデータを結合する (Visual Basic)

Visual Basic には、 JoinGroup Join のクエリ句が用意されており、コレクション間の共通値に基づいて複数のコレクションの内容を結合できます。 これらの値は キー 値と呼ばれます。 リレーショナル データベースの概念に精通している開発者は、 Join 句を INNER JOIN として認識し、 Group Join 句を LEFT OUTER JOIN として効果的に認識します。

このトピックの例では、 JoinGroup Join クエリ句を使用してデータを結合するいくつかの方法を示します。

プロジェクトの作成とサンプル データの追加

サンプル データと型を含むプロジェクトを作成するには

  1. このトピックのサンプルを実行するには、Visual Studio を開き、新しい Visual Basic コンソール アプリケーション プロジェクトを追加します。 Visual Basic によって作成されたModule1.vb ファイルをダブルクリックします。

  2. このトピックのサンプルでは、次のコード例の PersonPet の型とデータを使用します。 このコードを、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 句を使用して内部結合を実行するには

  1. プロジェクトの 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 句を使用して左外部結合を実行するには

  1. プロジェクトの 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 キーワードは、指定したすべてのキー フィールドが、結合される項目と一致する必要があることを指定します。

複合キーを使用して結合を実行するには

  1. 次のコードをプロジェクトの 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
    

コードを実行する

例を実行するコードを追加するには

  1. プロジェクトの Module1 モジュールのSub Mainを次のコードに置き換えて、このトピックの例を実行します。

    Sub Main()
        InnerJoinExample()
        LeftOuterJoinExample()
        CompositeKeyJoinExample()
    
        Console.ReadLine()
    End Sub
    
  2. F5 キーを押して例を実行します。

こちらも参照ください