Поделиться через


Предложение 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

Другие ресурсы

Запросы (Visual Basic)