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 句将集合合并到单个分层集合中。 这类似于 LEFT OUTER JOIN 在 SQL 中。

示例 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

另请参阅