Предложение Join (Visual Basic)
Обновлен: Ноябрь 2007
Объединяет две коллекции в одну. Операция Join (объединение) основана на сопоставлении ключей и использует оператор Equals.
Join element In collection _
[ joinClause _ ]
[ groupJoinClause ... _ ]
On key1 Equals key2 [ And key3 Equals key4 [... ]
Компоненты
element
Обязательный. Переменная управления для присоединяемой коллекции.collection
Обязательный. Коллекция для объединения с коллекцией, определенной в левой части оператора Join. Предложения Join могут быть вложены в другие предложения Join или в предложение Group Join.joinClause
Необязательно. Одно или несколько дополнительных предложений Join для дальнейшего уточнения запроса.groupJoinClause
Необязательно. Одно или несколько дополнительных предложений Group Join для дальнейшего уточнения запроса.key1Equalskey2
Обязательный. Определяет ключи для объединяемых коллекций. Необходимо использовать оператор Equals для сравнения ключей из объединяемых коллекций. Можно комбинировать условия соединения с помощью оператора And для идентификации нескольких ключей. Ключ key1 должен быть из коллекции в левой части оператора Join. Ключ key2 должен быть из коллекции в правой части оператора Join.Ключи, используемые в условии объединения, могут быть выражениями, включающими несколько элементов из коллекции. Однако каждое ключевое выражение может содержать только элементы из соответствующей ему коллекции.
Заметки
Предложение Join объединяет две коллекции на основании совпадающих значений ключей из соединяемых коллекций. Результирующая коллекция может содержать любую комбинацию значений из коллекции в левой части оператора Join и коллекции указанной в предложении Join. Запрос будет возвращать только те результаты, для которых соблюдается условие, заданное оператором Equals. Это эквивалентно INNER JOIN в SQL.
Можно использовать несколько предложений Join в запросе для объединения двух или более коллекций в одну.
Можно выполнять неявные соединения для объединения коллекций без предложения Join. Для этого включите несколько предложений In в предложение From и укажите предложение Where, определяющее ключи, которые необходимо использовать для соединения.
Можно использовать предложение Group Join для объединения коллекций в одну иерархическую коллекцию. Это аналогично LEFT OUTER JOIN в SQL.
Пример
В следующем примере кода выполняется неявное соединение для объединения списка заказчиков и их заказов.
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
В следующем примере кода две коллекции объединяются с помощью предложения 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
В этом примере вывод совпадает с приведенным ниже:
winlogon (968), Windows Logon
explorer (2424), Windows Explorer
cmd (5136), Command Window
В следующем примере кода объединяются две коллекции с помощью предложения Join с двумя столбцами ключей.
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
В этом примере вывод совпадает с приведенным ниже:
winlogon (968), Windows Logon, Priority = 13
cmd (700), Command Window, Priority = 8
explorer (2424), Windows Explorer, Priority = 8
См. также
Основные понятия
Знакомство с LINQ в Visual Basic
Ссылки
Предложение Select (Visual Basic)
Предложение Group Join (Visual Basic)
Предложение Where (Visual Basic)