Megosztás a következőn keresztül:


Útmutató: Adatok kombinálása a LINQ-val illesztések használatával (Visual Basic)

A Visual Basic biztosítja a Join lekérdezési záradékokat Group Join , amelyek lehetővé teszik több gyűjtemény tartalmának kombinálását a gyűjtemények közötti közös értékek alapján. Ezeket az értékeket kulcsértékeknek nevezzük. A relációs adatbázis fogalmait ismerő fejlesztők a Join záradékot INNER JOIN-ként ismerik fel, a Group Join záradékot pedig gyakorlatilag BAL OLDALI KÜLSŐ ILLESZTÉSként.

A jelen témakörben szereplő példák bemutatják, hogyan kombinálhatók az adatok a lekérdezési záradékok és Group Join a Join lekérdezési záradékok használatával.

Projekt létrehozása és mintaadatok hozzáadása

Mintaadatokat és típusokat tartalmazó projekt létrehozása

  1. A jelen témakörben szereplő minták futtatásához nyissa meg a Visual Studiót, és adjon hozzá egy új Visual Basic Console-alkalmazásprojektet. Kattintson duplán a Visual Basic által létrehozott Module1.vb fájlra.

  2. A jelen témakörben szereplő minták az PersonPet alábbi kód példában szereplő típusokat és adatokat használják. Másolja ezt a kódot a Visual Basic által létrehozott alapértelmezett Module1 modulba.

    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
    

Belső illesztés végrehajtása az Illesztési záradék használatával

Az INNER JOIN két gyűjtemény adatait egyesíti. Azokat az elemeket tartalmazza, amelyekhez a megadott kulcsértékek egyeznek. A másik gyűjteményben nem egyező elemekkel nem rendelkező gyűjteményből származó elemek nem lesznek kizárva.

A Visual Basicben a LINQ két lehetőséget kínál az INNER JOIN végrehajtására: implicit illesztést és explicit illesztést.

Az implicit illesztés megadja a záradékhoz From csatlakoztatni kívánt gyűjteményeket, és azonosítja a záradék egyező Where kulcsmezőit. A Visual Basic implicit módon összekapcsolja a két gyűjteményt a megadott kulcsmezők alapján.

Explicit illesztés megadásához használja a Join záradékot, ha meg szeretné határozni, hogy mely kulcsmezőket szeretné használni az illesztésben. Ebben az esetben egy Where záradék továbbra is használható a lekérdezési eredmények szűrésére.

Belső illesztés végrehajtása a Join záradék használatával

  1. Adja hozzá a következő kódot a Module1 projekt moduljához, hogy láthassa az implicit és explicit belső illesztés példáit.

    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
    

Bal oldali külső illesztés végrehajtása a Csoportbeillesztési záradék használatával

A BAL OLDALI KÜLSŐ ILLESZTÉS az illesztés bal oldali gyűjteményének összes elemét tartalmazza, és csak az illesztés jobb oldali gyűjteményéből származó értékeket. Az illesztés jobb oldali gyűjteményének azon elemei, amelyek nem rendelkeznek egyező elemekkel a bal oldali gyűjteményben, ki lesznek zárva a lekérdezés eredményéből.

A Group Join záradék lényegében BAL OLDALI KÜLSŐ ILLESZTÉST hajt végre. A jellemzően BAL OLDALI KÜLSŐ ILLESZTÉS néven ismert és a Group Join záradék által visszaadott elemek közötti különbség az, hogy a Group Join záradékcsoportok a bal oldali gyűjtemény egyes elemeinek jobb oldali gyűjteményéből származnak. Egy relációs adatbázisban a BAL OLDALI KÜLSŐ ILLESZTÉS egy nem csoportosított eredményt ad vissza, amelyben a lekérdezési eredmény minden eleme egyező elemeket tartalmaz az illesztés mindkét gyűjteményéből. Ebben az esetben az illesztés bal oldali gyűjteményéből származó elemek ismétlődnek a jobb oldali gyűjtemény minden egyező eleméhez. A következő eljárás elvégzésekor látni fogja, hogyan néz ki ez a folyamat.

A lekérdezés eredményeit Group Join csoportosítatlan eredményként is lekérheti, ha kiterjeszti a lekérdezést, hogy minden egyes csoportosított lekérdezési eredményhez visszaadjon egy elemet. Ehhez meg kell győződnie arról, hogy a DefaultIfEmpty csoportosított gyűjtemény metódusát kérdezi le. Ez biztosítja, hogy az illesztés bal oldali gyűjteményéből származó elemek továbbra is szerepelni fognak a lekérdezés eredményében, még akkor is, ha a jobb oldali gyűjtemény nem rendelkezik egyező eredménnyel. A lekérdezéshez kódot is hozzáadhat, hogy alapértelmezett eredményértéket adjon meg, ha az illesztés jobb oldali gyűjteményében nincs egyező érték.

Bal oldali külső illesztés végrehajtása a Csoportosítási záradék használatával

  1. Adja hozzá a következő kódot a Module1 projekt moduljához, hogy példákat jelenítsen meg a csoportosított bal oldali külső illesztésről és a nem csoportosított bal oldali külső illesztésről.

    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
    

Csatlakozás végrehajtása összetett kulcs használatával

Egy vagy Group Join több záradékban lévő Join kulcsszóval And több olyan kulcsmezőt is azonosíthat, amelyet az összekapcsolt gyűjtemények értékeinek megfeleltetésekor használhat. A And kulcsszó azt határozza meg, hogy az összes megadott kulcsmezőnek meg kell egyeznie az elemek csatlakoztatásához.

Csatlakozás végrehajtása összetett kulccsal

  1. Adja hozzá a következő kódot a Module1 projekt moduljához, hogy példákat láthasson egy összetett kulcsot használó illesztésre.

    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
    

A kód futtatása

Kód hozzáadása a példák futtatásához

  1. Cserélje le a Sub MainModule1 projekt modulját a következő kódra a jelen témakör példáinak futtatásához.

    Sub Main()
        InnerJoinExample()
        LeftOuterJoinExample()
        CompositeKeyJoinExample()
    
        Console.ReadLine()
    End Sub
    
  2. A példák futtatásához nyomja le az F5 billentyűt.

Lásd még