Join, clause (Visual Basic)

Combine deux collections en une collection unique. L’opération de jointure est basée sur des clés correspondantes et utilise l’opérateur Equals.

Syntaxe

Join element In collection _
  [ joinClause _ ]
  [ groupJoinClause ... _ ]
On key1 Equals key2 [ And key3 Equals key4 [... ]

Éléments

element Obligatoire. La variable de contrôle pour la collection en cours de jointure.

collection
Obligatoire. La collection à combiner avec la collection identifiée sur le côté gauche de l’opérateur Join. Une clause Join peut être imbriquée dans une autre clause Join ou dans une clause Group Join.

joinClause
Optionnel. Une ou plusieurs clauses Join supplémentaires pour affiner davantage la requête.

groupJoinClause
Optionnel. Une ou plusieurs clauses Group Join supplémentaires pour affiner davantage la requête.

key1 Equals key2
Obligatoire. Identifie les clés pour les collections en cours de jointure. Vous devez utiliser l’opérateur Equals pour comparer les clés des collections en cours de jointure. Vous pouvez combiner des conditions de jointure à l’aide de l’opérateur And pour identifier plusieurs clés. key1 doit provenir de la collection sur le côté gauche de Join l’opérateur. key2 doit provenir de la collection sur le côté droit de Join l’opérateur.

Les clés utilisées dans la condition de jointure peuvent être des expressions qui incluent plus d’un élément de la collection. Toutefois, chaque expression clé ne peut contenir que des éléments de sa collection respective.

Notes

La clause Join combine deux collections en fonction des valeurs de clé correspondantes des collections jointes. La collection résultante peut contenir n’importe quelle combinaison de valeurs de la collection identifiée sur le côté gauche de l’opérateur Join et de la collection identifiée dans la clause Join. La requête retourne uniquement les résultats pour lesquels la condition spécifiée par l’opérateur Equals est remplie. Cela est équivalent à un INNER JOIN dans SQL.

Vous pouvez utiliser plusieurs clauses Join dans une requête pour joindre deux collections ou plus en une seule collection.

Vous pouvez effectuer une jointure implicite pour combiner des collections sans la clause Join. Pour ce faire, incluez plusieurs clauses In dans votre clause From et spécifiez une clause Where qui identifie les clés que vous souhaitez utiliser pour la jointure.

Vous pouvez utiliser la clause Group Join pour combiner des collections en une seule collection hiérarchique. On peut comparer cela à un LEFT OUTER JOIN dans SQL.

Exemple 1

L’exemple de code suivant effectue une jointure implicite pour combiner une liste de clients avec leurs commandes.

Dim customerIDs() = {"ALFKI", "VICTE", "BLAUS", "TRAIH"}

Dim customerList = From cust In customers, custID In customerIDs
                   Where cust.CustomerID = custID
                   Select cust.CompanyName

For Each companyName In customerList
    Console.WriteLine(companyName)
Next

Exemple 2

L’exemple de code suivant joint deux collections à l’aide de la clause Join.

Imports System.Diagnostics

Public Class JoinSample

    Public Sub ListProcesses()
        Dim processDescriptions As New List(Of ProcessDescription)
        processDescriptions.Add(New ProcessDescription With {
                                    .ProcessName = "explorer",
                                    .Description = "Windows Explorer"})
        processDescriptions.Add(New ProcessDescription With {
                                    .ProcessName = "winlogon",
                                    .Description = "Windows Logon"})
        processDescriptions.Add(New ProcessDescription With {
                                    .ProcessName = "cmd",
                                    .Description = "Command Window"})
        processDescriptions.Add(New ProcessDescription With {
                                    .ProcessName = "iexplore",
                                    .Description = "Internet Explorer"})

        Dim processes = From proc In Process.GetProcesses
                        Join desc In processDescriptions
                          On proc.ProcessName Equals desc.ProcessName
                        Select proc.ProcessName, proc.Id, desc.Description

        For Each proc In processes
            Console.WriteLine("{0} ({1}), {2}",
                              proc.ProcessName, proc.Id, proc.Description)
        Next
    End Sub

End Class

Public Class ProcessDescription
    Public ProcessName As String
    Public Description As String
End Class

L’exemple produit par cette commande est semblable à ce qui suit :

winlogon (968), Windows Logon

explorer (2424), File Explorer

cmd (5136), Command Window

Exemple 3

L’exemple de code suivant joint deux collections à l’aide de la clause Join avec deux colonnes clés.

Imports System.Diagnostics

Public Class JoinSample2

    Public Sub ListProcesses()
        Dim processDescriptions As New List(Of ProcessDescription2)

        ' 8 = Normal priority, 13 = High priority
        processDescriptions.Add(New ProcessDescription2 With {
                                    .ProcessName = "explorer",
                                    .Description = "Windows Explorer",
                                    .Priority = 8})
        processDescriptions.Add(New ProcessDescription2 With {
                                    .ProcessName = "winlogon",
                                    .Description = "Windows Logon",
                                    .Priority = 13})
        processDescriptions.Add(New ProcessDescription2 With {
                                    .ProcessName = "cmd",
                                    .Description = "Command Window",
                                    .Priority = 8})
        processDescriptions.Add(New ProcessDescription2 With {
                                    .ProcessName = "iexplore",
                                    .Description = "Internet Explorer",
                                    .Priority = 8})

        Dim processes = From proc In Process.GetProcesses
                        Join desc In processDescriptions
                          On proc.ProcessName Equals desc.ProcessName And
                             proc.BasePriority Equals desc.Priority
                        Select proc.ProcessName, proc.Id, desc.Description,
                               desc.Priority

        For Each proc In processes
            Console.WriteLine("{0} ({1}), {2}, Priority = {3}",
                              proc.ProcessName,
                              proc.Id,
                              proc.Description,
                              proc.Priority)
        Next
    End Sub

End Class

Public Class ProcessDescription2
    Public ProcessName As String
    Public Description As String
    Public Priority As Integer
End Class

L’exemple produit par cette commande est semblable à ce qui suit :

winlogon (968), Windows Logon, Priority = 13

cmd (700), Command Window, Priority = 8

explorer (2424), File Explorer, Priority = 8

Voir aussi