Join Clause (Visual Basic)
Combines two collections into a single collection. The join operation is based on matching keys and uses the Equals operator.
Join element In collection _ [ joinClause _ ] [ groupJoinClause ... _ ] On key1 Equals key2 [ And key3 Equals key4 [... ]
The Join clause combines two collections based on matching key values from the collections being joined. The resulting collection can contain any combination of values from the collection identified on the left side of the Join operator and the collection identified in the Join clause. The query will return only results for which the condition specified by the Equals operator is met. This is equivalent to an INNER JOIN in SQL.
You can use multiple Join clauses in a query to join two or more collections into a single collection.
You can perform an implicit join to combine collections without the Join clause. To do this, include multiple In clauses in your From clause and specify a Where clause that identifies the keys that you want to use for the join.
You can use the Group Join clause to combine collections into a single hierarchical collection. This is like a LEFT OUTER JOIN in SQL.
The following code example performs an implicit join to combine a list of customers with their orders.
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
The following code example joins two collections by using the Join clause.
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
This example will produce output similar to the following:
winlogon (968), Windows Logon
explorer (2424), File Explorer
cmd (5136), Command Window
The following code example joins two collections by using the Join clause with two key columns.
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
The example will produce output similar to the following:
winlogon (968), Windows Logon, Priority = 13
cmd (700), Command Window, Priority = 8
explorer (2424), File Explorer, Priority = 8