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