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