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 子句。

  • key1Equalskey2
    必选。 标识要联接的集合的键。 必须使用 Equals 运算符来比较要联接的集合的键。 您可以使用 And 运算符标识多个键,从而组合联接条件。 key1 必须来自于 Join 运算符左侧的集合。 key2 必须来自于 Join 运算符右侧的集合。

    在联接条件中使用的键可以是包含集合中的多个项的表达式。 不过,每个键表达式只能包含其各自集合中的项。

备注

Join 子句基于要联接的集合中的匹配键值组合两个集合。 所得集合可以包含 Join 运算符左侧标识的集合和 Join 子句中标识的集合的值的任何组合。 查询将只返回满足 Equals 运算符所指定的条件的结果。 这等效于 SQL 中的 INNER JOIN。

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

在不使用 Join 子句的情况下,可以执行隐式联接来组合集合。 为此,应在 From 子句中包括多个 In 子句,并指定标识要用于联接的键的 Where 子句。

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

示例

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

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), Windows 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), Windows Explorer, Priority = 8

请参见

参考

Select 子句 (Visual Basic)

From 子句 (Visual Basic)

Group Join 子句 (Visual Basic)

Where 子句 (Visual Basic)

概念

Visual Basic 中的 LINQ 简介

其他资源

查询 (Visual Basic)