将两个集合合并为一个集合。 联接作基于匹配键并使用 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