Join 子句 (Visual Basic)

将两个集合合并为单个集合。 联接操作基于匹配的键并使用 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 运算符指定的条件的结果。 这等效于 SQL 中的 INNER JOIN

可以在查询中使用多个 Join 子句将两个或多个集合联接到单个集合中。

可以执行隐式联接以合并集合而不使用 Join 子句。 为此,请在你的 From 子句中包括多个 In 子句,并指定一个 Where 子句,用于标识要用于联接的键。

可以使用 Group Join 子句将集合合并到单个分层集合中。 这与 SQL 中的 LEFT OUTER JOIN 类似。

示例 1

下面的代码示例执行隐式联接,以将客户列表与订单组合在一起。

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

示例 2

下面的代码示例使用 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

本示例生成类似下面的输出:

winlogon (968), Windows Logon

explorer (2424), File Explorer

cmd (5136), Command Window

示例 3

下面的代码示例使用具有两个键列的 Join 子句联接两个集合。

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

本示例生成类似下面的输出:

winlogon (968), Windows Logon, Priority = 13

cmd (700), Command Window, Priority = 8

explorer (2424), File Explorer, Priority = 8

另请参阅