Cláusula Join (Visual Basic)

Combina duas coleções em uma coleção única. A operação de junção é baseada em chaves correspondentes e usa o operador Equals.

Sintaxe

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

Partes

element Necessário. A variável de controle para a coleção que está sendo ingressadas.

collection
Obrigatórios. A coleção a ser combinada com a coleção identificada no lado esquerdo do operador Join. Uma cláusula Join pode ser aninhada em outra cláusula Join ou em Group Join.

joinClause
Opcional. Uma ou mais cláusulas adicionais Join para refinar ainda mais a consulta.

groupJoinClause
Opcional. Uma ou mais cláusulas adicionais Group Join para refinar ainda mais a consulta.

key1 Equals key2
Obrigatórios. Identifica as chaves para as coleções sendo ingressadas. Você deve usar o operador Equals para comparar as chaves das coleções que estão sendo ingressadas. Você pode combinar condições de junção usando o operador And para identificar várias chaves. key1 deve vir da coleção do lado esquerdo do operador Join. key2 deve vir da coleção do lado direito do operador Join.

As chaves usadas na condição de junção podem ser expressões que incluem mais de um item da coleção. No entanto, cada expressão de chave pode conter apenas itens de sua respectiva coleção.

Comentários

A cláusula Join combina duas coleções com base em valores de chave correspondentes das coleções que estão sendo ingressadas. A coleção resultante pode conter qualquer combinação de valores da coleção identificada no lado esquerdo do operador Join e a coleção identificada na cláusula Join. A consulta retornará apenas os resultados para os quais a condição especificada pelo operador Equals é atendida. Isso é equivalente a INNER JOIN no SQL.

Você pode usar várias cláusulas Join em uma consulta para unir duas ou mais coleções em uma coleção única.

Você pode executar uma junção implícita para combinar coleções sem a cláusula Join. Para fazer isso, inclua várias cláusulas In em From e especifique uma cláusula Where que identifique as chaves que você deseja usar para a junção.

Você pode usar a cláusula Group Join para combinar coleções em uma coleção hierárquica única. Isso é como um LEFT OUTER JOIN no SQL.

Exemplo 1

O exemplo de código a seguir executa uma junção implícita para combinar uma lista de clientes com seus pedidos.

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

Exemplo 2

O exemplo de código a seguir une duas coleções usando a cláusula 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

Este exemplo produzirá uma saída semelhante à seguinte:

winlogon (968), Windows Logon

explorer (2424), File Explorer

cmd (5136), Command Window

Exemplo 3

O exemplo de código a seguir une duas coleções usando a cláusula Join com duas colunas de chave.

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

O exemplo produzirá uma saída semelhante à seguinte:

winlogon (968), Windows Logon, Priority = 13

cmd (700), Command Window, Priority = 8

explorer (2424), File Explorer, Priority = 8

Confira também