Join 절(Visual Basic)

업데이트: 2007년 11월

두 개의 컬렉션을 단일 컬렉션으로 결합합니다. 조인 연산은 일치하는 키를 기준으로 하며 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 절입니다.

  • key1Equalskey2
    필수적 요소. 조인된 컬렉션의 키를 식별합니다. 조인된 컬렉션에서 키를 비교하려면 Equals 연산자를 사용해야 합니다. And 연산자로 조인 조건을 결합하여 여러 키를 식별할 수 있습니다. key1은 Join 연산자의 왼쪽에 있는 컬렉션에서 가져와야 합니다. key2는 Join 연산자의 오른쪽에 있는 컬렉션에서 가져와야 합니다.

    조인 조건에 사용되는 키는 컬렉션에서 두 개 이상의 항목을 포함하는 식일 수 있습니다. 하지만 각 키 식에는 해당 컬렉션의 항목만 포함할 수 있습니다.

설명

Join 절은 조인된 컬렉션의 일치하는 키 값을 기준으로 두 개의 컬렉션을 결합합니다. 결과 컬렉션에는 Join 연산자의 왼쪽에서 식별된 컬렉션과 Join 절에서 식별된 컬렉션에서 가져온 값의 결합이 포함될 수 있습니다. 쿼리는 Equals 연산자에 의해 지정된 조건을 충족하는 결과만 반환합니다. 이는 SQL의 INNER JOIN과 같습니다.

한 쿼리에서 여러 Join 절을 사용하여 두 개 이상의 컬렉션을 단일 컬렉션으로 조인할 수 있습니다.

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

다음 코드 예제에서는 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), Windows Explorer

cmd (5136), Command Window

다음 코드 예제에서는 두 개의 키 열과 함께 Join 절을 사용하여 두 개의 컬렉션을 조인합니다.

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), Windows Explorer, Priority = 8

참고 항목

개념

Visual Basic의 LINQ 소개

참조

Select 절(Visual Basic)

From 절(Visual Basic)

Group Join 절(Visual Basic)

Where 절(Visual Basic)

기타 리소스

쿼리(Visual Basic)