Aracılığıyla paylaş


Nasıl yapılır: Birleştirmeleri Kullanarak Verileri LINQ ile Birleştirme (Visual Basic)

Visual Basic, koleksiyonlar arasındaki ortak değerlere göre birden çok koleksiyonun içeriğini birleştirmenizi sağlayan Join ve Group Join sorgu yan tümcelerini sağlar. Bu değerler anahtar değerleri olarak bilinir. İlişkisel veritabanı kavramlarına aşina olan geliştiriciler, Join ifadesini INNER JOIN ve Group Join ifadesini ise etkili bir şekilde LEFT OUTER JOIN olarak tanıyacaklardır.

Bu konudaki örnekler, Join ve Group Join sorgu yan tümcelerini kullanarak verileri birleştirmenin birkaç yolunu göstermektedir.

Proje Oluşturma ve Örnek Veri Ekleme

Örnek veriler ve türler içeren bir proje oluşturmak için

  1. Bu konudaki örnekleri çalıştırmak için Visual Studio'yu açın ve yeni bir Visual Basic Konsol Uygulaması projesi ekleyin. Visual Basic tarafından oluşturulan Module1.vb dosyasına çift tıklayın.

  2. Bu konudaki örneklerde Person ve Pet türleri ile aşağıdaki kod örneğinden veri kullanılır. Bu kodu Visual Basic tarafından oluşturulan varsayılan Module1 modüle kopyalayın.

    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
    

İç Birleşim Gerçekleştirmek İçin Join Yan Tümcesi Kullanma

INNER JOIN, iki koleksiyondan verileri birleştirir. Belirtilen anahtar değerlerinin eşleşdiği öğeler eklenir. Diğer koleksiyonda eşleşen bir öğe olmayan herhangi bir koleksiyondaki öğeler dışlanır.

Visual Basic'te LINQ, INNER JOIN gerçekleştirmek için iki seçenek sunar: örtük birleştirme ve açık birleştirme.

Gizli birleştirme, bir From yan tümcesinde birleştirilecek koleksiyonları belirtir ve bir Where yan tümcesinde eşleşen anahtar alanlarını tanımlar. Visual Basic, belirtilen anahtar alanlarına göre iki koleksiyonu örtük olarak birleştirir.

Birleştirmede hangi anahtar alanlarının kullanılacağı konusunda belirli olmak istediğinizde yan tümcesini Join kullanarak açık bir birleşim belirtebilirsiniz. Bu durumda sorgu sonuçlarını filtrelemek için yan Where tümcesi kullanılabilir.

İç Birleştirme gerçekleştirmek için Join yan tümcesini kullanın

  1. Hem örtük hem de açık iç birleşim örneklerini görmek için projenizdeki modüle aşağıdaki kodu Module1 ekleyin.

    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
    

Grup Birleştirme Yan Tümcesini Kullanarak Sol Dış Birleşim Yapın

LEFT OUTER JOIN, birleştirmenin sol tarafındaki koleksiyondaki tüm öğeleri ve yalnızca birleştirmenin sağ tarafındaki koleksiyonundan eşleşen değerleri içerir. Birleştirmenin sağ tarafındaki koleksiyonundaki, sol taraftaki koleksiyonda karşılık gelen bir öğe bulunmayan öğeler sorgu sonucundan dışlanır.

Group Join ifadesi özünde bir LEFT OUTER JOIN gerçekleştirir. Genellikle LEFT OUTER JOIN olarak bilinen ile Group Join yan tümcesinin döndürdüğü değer arasında fark, Group Join yan tümcesinin sol taraftaki koleksiyondaki her öğe için birleştirmenin sağ tarafındaki koleksiyonu gruplamasıdır. İlişkisel veritabanında, LEFT OUTER JOIN sorgu sonucundaki her öğenin birleştirmedeki her iki koleksiyondan eşleşen öğeleri içerdiği gruplandırılmamış bir sonuç döndürür. Bu durumda, birleştirmenin sol tarafındaki koleksiyondaki öğeler sağ taraftaki koleksiyondan eşleşen her öğe için yinelenir. Sonraki yordamı tamamladığınızda bunun nasıl göründüğünü göreceksiniz.

Gruplandırılan her sorgu sonucu için bir Group Join öğe döndürmek üzere sorgunuzu genişleterek, sorgunun sonuçlarını gruplandırılmamış bir sonuç olarak alabilirsiniz. Bunu başarmak için, gruplandırılmış koleksiyonun DefaultIfEmpty yöntemini sorguladığınızdan emin olmanız gerekir. Bu, sağ taraftaki koleksiyondan eşleşen sonuç olmasa bile birleştirmenin sol tarafındaki koleksiyondaki öğelerin sorgu sonucuna dahil edilmesini sağlar. Birleştirmenin sağ tarafındaki koleksiyondan eşleşen değer olmadığında varsayılan sonuç değeri sağlamak için sorgunuza kod ekleyebilirsiniz.

Sol Dış Birleşimi gerçekleştirmek için Group Join yan tümcesini kullanmak

  1. Hem gruplandırılmış sol dış birleşim hem de gruplanmamış sol dış birleşim örneklerini görmek için projenizdeki modüle aşağıdaki kodu Module1 ekleyin.

    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
    

Bileşik Anahtar Kullanarak Birleştirme Gerçekleştirme

Bir And veya Join yan tümcesinde Group Join anahtar sözcüğünü kullanarak, birleştirilen koleksiyonlardaki değerleri eşleştirirken kullanılacak birden çok anahtar alanı tanımlayabilirsiniz. anahtar And sözcüğü, birleştirilecek öğeler için belirtilen tüm anahtar alanlarının eşleşmesi gerektiğini belirtir.

Bileşik anahtar kullanarak Birleştirme gerçekleştirmek için

  1. Bileşik anahtar kullanan birleştirme örneklerini görmek için projenizdeki modüle aşağıdaki kodu Module1 ekleyin.

    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
    

Kodu Çalıştırma

Örnekleri çalıştırmak için kod eklemek için

  1. Sub Main öğesini, bu konudaki örnekleri çalıştırmak için projenizdeki Module1 modülünde aşağıdaki kodla değiştirin.

    Sub Main()
        InnerJoinExample()
        LeftOuterJoinExample()
        CompositeKeyJoinExample()
    
        Console.ReadLine()
    End Sub
    
  2. Örnekleri çalıştırmak için F5 tuşuna basın.

Ayrıca bakınız