Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Visual Basic fournit les Join
clauses de requête et Group Join
de requête pour vous permettre de combiner le contenu de plusieurs collections en fonction des valeurs communes entre les collections. Ces valeurs sont appelées valeurs de clé . Les développeurs familiarisés avec les concepts de base de données relationnelle reconnaîtront la Join
clause en tant que JOINTURE INTERNE et la Group Join
clause comme étant, efficacement, une JOINTURE EXTERNE LEFT.
Les exemples de cette rubrique illustrent quelques façons de combiner des données à l’aide des clauses de requête et Group Join
des Join
clauses.
Créer un projet et ajouter des exemples de données
Pour créer un projet qui contient des exemples de données et de types
Pour exécuter les exemples de cette rubrique, ouvrez Visual Studio et ajoutez un nouveau projet d’application console Visual Basic. Double-cliquez sur le fichier Module1.vb créé par Visual Basic.
Les exemples de cette rubrique utilisent les
Person
types etPet
données de l’exemple de code suivant. Copiez ce code dans le module par défautModule1
créé par Visual Basic.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
Effectuer une jointure interne à l’aide de la clause Join
Inner JOIN combine les données de deux collections. Éléments pour lesquels les valeurs de clé spécifiées correspondent sont inclus. Tous les éléments d’une collection qui n’ont pas d’élément correspondant dans l’autre collection sont exclus.
Dans Visual Basic, LINQ fournit deux options pour effectuer une jointure INNER JOIN : une jointure implicite et une jointure explicite.
Une jointure implicite spécifie les collections à joindre dans une From
clause et identifie les champs de clé correspondants dans une Where
clause. Visual Basic joint implicitement les deux collections en fonction des champs clés spécifiés.
Vous pouvez spécifier une jointure explicite à l’aide de la Join
clause lorsque vous souhaitez être spécifique sur les champs clés à utiliser dans la jointure. Dans ce cas, une Where
clause peut toujours être utilisée pour filtrer les résultats de la requête.
Pour effectuer une jointure interne à l’aide de la clause Join
Ajoutez le code suivant au
Module1
module de votre projet pour voir des exemples de jointure interne implicite et explicite.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
Effectuer une jointure externe gauche à l’aide de la clause De jointure de groupe
Une jointure EXTERNE GAUCHE inclut tous les éléments de la collection de gauche de la jointure et uniquement les valeurs correspondantes de la collection de droite de la jointure. Tous les éléments de la collection de droite de la jointure qui n’ont pas d’élément correspondant dans la collection de gauche sont exclus du résultat de la requête.
La Group Join
clause effectue, en effet, une JOINTURE EXTERNE GAUCHE. La différence entre ce qui est généralement appelé LEFT OUTER JOIN et ce que la Group Join
clause retourne est que la Group Join
clause regroupe les résultats de la collection de droite de la jointure pour chaque élément de la collection de gauche. Dans une base de données relationnelle, une jointure EXTERNE LEFT retourne un résultat non groupé dans lequel chaque élément du résultat de la requête contient des éléments correspondants des deux collections de la jointure. Dans ce cas, les éléments de la collection de gauche de la jointure sont répétés pour chaque élément correspondant de la collection de droite. Vous verrez à quoi ressemble la procédure suivante.
Vous pouvez récupérer les résultats d’une Group Join
requête en tant que résultat non groupé en étendant votre requête pour renvoyer un élément pour chaque résultat de requête groupé. Pour ce faire, vous devez vous assurer que vous interrogez sur la DefaultIfEmpty
méthode de la collection groupée. Cela garantit que les éléments de la collection de gauche de la jointure sont toujours inclus dans le résultat de la requête, même s’ils n’ont aucun résultat correspondant de la collection de droite. Vous pouvez ajouter du code à votre requête pour fournir une valeur de résultat par défaut lorsqu’il n’existe aucune valeur correspondante de la collection de droite de la jointure.
Pour effectuer une jointure externe gauche à l’aide de la clause Group Join
Ajoutez le code suivant au
Module1
module de votre projet pour voir des exemples de jointure externe gauche groupée et d’une jointure externe gauche non groupée.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
Effectuer une jointure à l’aide d’une clé composite
Vous pouvez utiliser le And
mot clé dans une Join
ou Group Join
clause pour identifier plusieurs champs clés à utiliser lors de la correspondance de valeurs des collections jointes. Le And
mot clé spécifie que tous les champs de clé spécifiés doivent correspondre pour que les éléments soient joints.
Pour effectuer une jointure à l’aide d’une clé composite
Ajoutez le code suivant au
Module1
module de votre projet pour voir des exemples de jointure qui utilise une clé composite.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
Exécuter le code
Pour ajouter du code pour exécuter les exemples
Remplacez le
Sub Main
Module1
module dans votre projet par le code suivant pour exécuter les exemples de cette rubrique.Sub Main() InnerJoinExample() LeftOuterJoinExample() CompositeKeyJoinExample() Console.ReadLine() End Sub
Appuyez sur F5 pour exécuter les exemples.