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