Ú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
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.
A jelen témakörben szereplő minták az
Person
Pet
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értelmezettModule1
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
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
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
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
Cserélje le a
Sub Main
Module1
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
A példák futtatásához nyomja le az F5 billentyűt.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: