Join 句 (Visual Basic)
2 つのコレクションを単一のコレクションに結合します。結合操作は一致キーに基づいて実行され、Equals 演算子を使用します。
Join element In collection _
[ joinClause _ ]
[ groupJoinClause ... _ ]
On key1 Equals key2 [ And key3 Equals key4 [... ]
指定項目
element
必須。結合するコレクションのコントロール変数です。collection
必須。Join 演算子の左側で識別されるコレクションと結合するコレクション。Join 句は、別の Join 句の中に入れ子で指定することも、Group Join 句の中に指定することもできます。joinClause
省略可能。クエリを絞り込むための 1 つ以上の追加の Join 句。groupJoinClause
省略可能。クエリを絞り込むための 1 つ以上の追加の Group Join 句。key1Equalskey2
必須。結合するコレクションのキーを識別します。Equals 演算子を使用して、結合するコレクションのキーを比較する必要があります。複数のキーを識別する And 演算子を使用して、結合条件を組み合わせることができます。key1 は、Join 演算子の左側のコレクションのキーでなければなりません。key2 は、Join 演算子の右側のコレクションのキーでなければなりません。コレクションの複数の項目を含む式を結合条件で使用するキーにすることができます。ただし、それぞれのキー式は、該当するコレクションの項目を 1 つだけ格納できます。
解説
Join 句は、結合するコレクションの一致するキー値に基づいて、2 つのコレクションを結合します。結合後のコレクションには、Join 演算子の左側で識別されるコレクションの値と、Join 句の中で識別されるコレクションの値が、任意の組み合わせで格納されます。このクエリでは、Equals 演算子に指定した条件と一致する結果だけが返されます。これは、SQL の INNER JOIN に相当します。
1 つのクエリで複数の Join 句を使用して、2 つ以上のコレクションを単一のコレクションに結合できます。
Join 句を使用せずに、暗黙的な結合を実行してコレクションを結合できます。これを行うには、複数の In 句を From 句に記述し、結合で使用するキーを識別する 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
次のコード例では、2 つのコレクションを 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), File Explorer
cmd (5136), Command Window
次のコード例では、2 つのコレクションを Join 句と 2 つのキー列を使用して結合します。
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), File Explorer, Priority = 8