Join, clause (Visual Basic)

Regroupe deux collections en une collection unique. L'opération de jointure, basée sur la correspondance des clés, utilise l'opérateur Equals.

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

Éléments

  • element
    Obligatoire. Variable de contrôle pour la collection qui est jointe.

  • collection
    Obligatoire. Collection à combiner à la collection identifiée qui se trouve du 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
    Facultatif. Une ou plusieurs clauses supplémentaires Join pour affiner la requête.

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

  • key1Equalskey2
    Obligatoire. Identifie les clés des collections qui sont jointes. Vous devez utiliser l'opérateur Equals pour comparer les clés des collections qui sont jointes. Vous pouvez associer des conditions de jointure à l'aide de l'opérateur And afin d'identifier plusieurs clés. key1 doit être de la collection sur le côté gauche de l'opérateur Join. key2 doit être à droite de la collection côté de l'opérateur Join.

    Les clés utilisées dans la condition de jointure peuvent être des expressions incluant plusieurs éléments de la collection. Toutefois, chaque expression clé peut contenir uniquement des éléments de sa collection respective.

Notes

La clause Join associe deux collections en fonctions des valeurs de clés correspondantes des collections qui sont jointes. La collection résultante peut contenir toutes les combinaisons de valeurs de la collection identifiée située du côté gauche de l'opérateur Join et de la collection identifiée dans la clause Join. La requête retournera uniquement des résultats pour lesquels la condition spécifiée par l'opérateur Equals est remplie. Cela équivaut à un INNER JOIN dans SQL.

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

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 collection hiérarchique unique. Cela équivaut à LEFT OUTER JOIN dans SQL.

Exemple

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

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

Imports System.Diagnostics
Imports System.Security.Permissions

Public Class JoinSample

  <SecurityPermission(SecurityAction.Demand)>
  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

Cet exemple produira un résultat analogue à celui-ci :

winlogon (968), Windows Logon

explorer (2424), Windows Explorer

cmd (5136), Command Window

L'exemple de code suivant joint deux collections en utilisant la clause Join avec deux colonnes clés.

Imports System.Diagnostics
Imports System.Security.Permissions

Public Class JoinSample2

  <SecurityPermission(SecurityAction.Demand)>
  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 produira un résultat analogue à celui-ci :

winlogon (968), Windows Logon, Priority = 13

cmd (700), Command Window, Priority = 8

explorer (2424), Windows Explorer, Priority = 8

Voir aussi

Référence

Select, clause (Visual Basic)

From, clause (Visual Basic)

Group Join, clause (Visual Basic)

Where, clause (Visual Basic)

Concepts

Introduction à LINQ dans Visual Basic

Autres ressources

Requêtes (Visual Basic)