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 句。

  • key1 Equals key2
    必須。 結合するコレクションのキーを識別します。 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

参照

関連項目

Select 句 (Visual Basic)

From 句 (Visual Basic)

Group Join 句 (Visual Basic)

Where 句 (Visual Basic)

概念

Visual Basic における LINQ の概要

その他の技術情報

クエリ (Visual Basic)