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 연산자를 사용하여 조인 조건을 결합할 수 있습니다. key1Join 연산자 왼쪽에 있는 컬렉션에서 가져와야 합니다. key2Join 연산자 오른쪽에 있는 컬렉션에서 가져와야 합니다.

조인 조건에 사용되는 키는 컬렉션에서 둘 이상의 항목을 포함하는 식일 수 있습니다. 그러나 각 키 식에는 해당 컬렉션의 항목만 포함될 수 있습니다.

설명

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

참고 항목