Предложение Join (Visual Basic)
Объединяет две коллекции в одну. Операция 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 для дальнейшего уточнения запроса.key1 Equals key2
Обязательное. Определяет ключи для объединяемых коллекций. Необходимо использовать оператор 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), File 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), File Explorer, Priority = 8
См. также
Ссылки
Предложение Select (Visual Basic)
Предложение From (Visual Basic)
Предложение Group Join (Visual Basic)
Предложение Where (Visual Basic)
Основные понятия
Знакомство с LINQ в Visual Basic