Join 子句 (Visual Basic)

将两个集合合并为一个集合。 联接作基于匹配键并使用 Equals 运算符。

语法

Join element In collection _
  [ joinClause _ ]
  [ groupJoinClause ... _ ]
On key1 Equals key2 [ And key3 Equals key4 [... ]

部件

element 必填。 要联接的集合的控件变量。

collection
必填。 要与运算符左侧标识的 Join 集合组合的集合。 子 Join 句可以嵌套在另一 JoinGroup Join 子句或子句中。

joinClause
可选。 用于进一步优化查询的一个或多个附加 Join 子句。

groupJoinClause
可选。 用于进一步优化查询的一个或多个附加 Group Join 子句。

key1 Equals key2
必填。 标识要联接的集合的键。 必须使用 Equals 运算符比较正在联接的集合中的键。 可以使用运算符标识多个键来组合联接条件 Andkey1 必须来自运算符左侧的 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

另请参阅