Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 bemutatnak néhány módot arra, hogyan kombinálhatók az adatok a Join és Group 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
PersonPetalá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értelmezettModule1modulba.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 SubClass 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 a Csatlakozási utasítás 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. Azok az elemek, amelyeknek nincs megfelelő párjuk a másik gyűjteményben, ki lesznek zá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 összekapcsolás megadja a From záradékban összekötendő gyűjteményeket, és azonosítja a Where záradék egyező 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
Module1projekt 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 Group Join 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, valamint csak a megfelelő értékeket tartalmazza az illesztés jobb oldali gyűjteményéből. 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 művelet és a Group Join záradék által visszaadott eredmények közötti különbség az, hogy a Group Join záradék csoportosítja a jobb oldali gyűjtemény eredményeit a bal oldali gyűjtemény minden egyes eleméhez viszonyítva. 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.
A bal oldali külső csatlakozás végrehajtása a Group Join záradék használatával
Adja hozzá a következő kódot a
Module1projekt 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
Az And kulcsszót használhatja az Join vagy Group Join záradékban, hogy az összekapcsolt gyűjtemények értékeinek megfeleltetésekor több kulcsmezőt is azonosítson. 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
Module1projekt 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 MainModule1projekt 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 SubA példák futtatásához nyomja le az F5 billentyűt.