기본 쿼리 작업(Visual Basic)

이 항목에서는 Visual Basic의 LINQ(Language-Integrated Query) 식과 쿼리에서 수행하는 일반적인 종류의 작업에 대해 간략하게 소개합니다. 자세한 내용은 아래 항목을 참조하세요.

Visual Basic의 LINQ 소개

쿼리

연습: Visual Basic에서 쿼리 작성

데이터 원본 지정(From)

LINQ 쿼리에서 첫 번째 단계는 쿼리할 데이터 원본을 지정하는 것입니다. 따라서 쿼리의 From 절이 항상 먼저 제공됩니다. 쿼리 연산자는 원본의 형식에 따라 결과를 선택하고 셰이프합니다.

Dim query = From cust In customers
'           ...

From 절은 데이터 원본, customers범위 변수cust을(를) 지정합니다. 범위 변수는 쿼리 식에서 실제 반복이 발생하지 않는다는 점을 제외하고 루프 반복 변수와 같습니다. 종종 For Each 루프를 사용하여 쿼리가 실행될 때 범위 변수는 customers의 각 연속 요소에 대한 참조 역할을 합니다. 컴파일러에서 cust 형식을 유추할 수 있으므로 명시적으로 지정할 필요가 없습니다. 명시적 타이핑이 있는 경우와 없는 경우의 쿼리 작성 예는 쿼리 작업의 형식 관계(Visual Basic)를 참조하세요.

Visual Basic에서 From 절을 사용하는 방법에 대한 자세한 내용은 From 절을 참조하세요.

데이터 필터링(Where)

아마도 가장 일반적인 쿼리 작업은 부울 식의 형태로 필터를 적용하는 것일 것입니다. 그런 다음 쿼리는 식이 true인 요소만 반환합니다. Where 절은 필터링을 수행하는 데 사용됩니다. 필터는 결과 시퀀스에 포함할 데이터 원본의 요소를 지정합니다. 다음 예제에서는 런던에 주소지가 있는 고객만 포함합니다.

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
'                 ...

AndOr 같은 논리 연산자를 사용하여 필터 식을 Where 절에 결합할 수 있습니다. 예를 들어 런던 출신이고 이름이 Devon인 고객만 반환하려면 다음 코드를 사용합니다.

Where cust.City = "London" And cust.Name = "Devon"

런던 또는 파리 출신인 고객을 반환하려면 다음 코드를 사용합니다.

Where cust.City = "London" Or cust.City = "Paris"

Visual Basic에서 Where 절을 사용하는 방법에 대한 자세한 내용은 Where 절을 참조하세요.

데이터 정렬(Order By)

반환된 데이터를 특정 순서로 정렬하면 편리합니다. Order By 절을 사용하면 반환된 시퀀스의 요소가 지정된 필드나 여러 필드에 정렬됩니다. 예를 들어 다음 쿼리는 Name 속성에 따라 결과를 정렬합니다. Name은(는) 문자열이므로 반환된 데이터는 A부터 Z의 알파벳 순으로 정렬됩니다.

Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
'                   ...

결과를 역순으로 정렬하려면 Order By...Descending 절을 사용합니다. Ascending 또는 Descending이(가) 지정되지 않은 경우 기본값은 Ascending입니다.

Visual Basic에서 Order By 절을 사용하는 방법에 대한 자세한 내용은 Order By 절을 참조하세요.

데이터 선택(Select)

Select 절은 반환된 요소의 양식과 콘텐츠를 지정합니다. 예를 들어 결과가 전체 Customer 개체, 하나의 Customer 속성, 속성의 하위 집합, 다양한 데이터 원본의 속성 조합 또는 계산을 기반으로 하는 몇 가지 새로운 결과 형식으로 구성될지 지정할 수 있습니다. Select 절이 소스 요소의 복사본이 아닌 다른 항목을 생성하는 경우 이 작업을 프로젝션이라고 합니다.

전체 Customer 개체로 구성된 컬렉션을 검색하려면 범위 변수 자체를 선택합니다.

Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust

Customer 인스턴스가 많은 필드가 있는 큰 객체이고 이름만 검색하려는 경우 다음 예와 같이 cust.Name을(를) 선택할 수 있습니다. 지역 형식 유추는 결과 형식이 Customer 개체 모음에서 문자열 모음으로 변경된다는 것을 인지합니다.

Dim londonCusts3 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust.Name

데이터 원본에서 여러 필드를 선택하려면 다음 두 가지 중 하나를 선택할 수 있습니다.

  • Select 절에서 결과에 포함할 필드를 지정합니다. 컴파일러는 해당 필드를 속성으로 포함하는 무명 형식을 정의합니다. 자세한 내용은 무명 형식을 참조하세요.

    다음 예제에서 반환된 요소는 무명 형식의 인스턴스이므로 코드의 다른 위치에서 이름으로 형식을 참조할 수 없습니다. 컴파일러 지정한 형식의 이름에는 일반적인 Visual Basic 코드에서 유효하지 않은 문자가 포함됩니다. 다음 예제에서 londonCusts4에 있는 쿼리가 반환하는 컬렉션의 요소는 무명 유형의 인스턴스입니다.

    Dim londonCusts4 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select Name = cust.Name, Phone = cust.Phone
    
    For Each londonCust In londonCusts4
        Console.WriteLine(londonCust.Name & " " & londonCust.Phone)
    Next
    

    또는

  • 결과에 포함할 특정 필드를 포함하는 명명된 형식을 정의하고 Select 절에서 형식의 인스턴스를 만들고 초기화하세요. 반환되는 컬렉션 외부에서 개별 결과를 사용해야 하거나 메서드 호출에서 매개 변수로 전달해야 하는 경우에만 이 옵션을 사용하세요. 다음 예제의 londonCusts5 형식은 IEnumerable(Of NamePhone)입니다.

    Public Class NamePhone
        Public Name As String
        Public Phone As String
        ' Additional class elements
    End Class
    
    Dim londonCusts5 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select New NamePhone With {.Name = cust.Name,
                                                  .Phone = cust.Phone}
    

Visual Basic에서 Select 절을 사용하는 방법에 대한 자세한 내용은 Select 절을 참조하세요.

데이터 조인(Join 및 Group Join)

여러 가지 방법으로 From 절에 둘 이상의 데이터 원본을 결합할 수 있습니다. 예를 들어, 다음 코드는 두 개의 데이터 원본을 사용하며 결과에서 두 데이터 원본의 속성을 암시적으로 결합합니다. 쿼리는 성이 모음으로 시작하는 학생을 선택합니다.

Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
                 Where student.Last.IndexOf(vowel) = 0
                 Select Name = student.First & " " &
                 student.Last, Initial = vowel
                 Order By Initial

For Each vName In vowelNames
    Console.WriteLine(vName.Initial & ":  " & vName.Name)
Next

참고 항목

방법: 항목 목록 만들기에서 만든 학생 목록을 사용하여 이 코드를 실행할 수 있습니다.

Join 키워드는 SQL의 INNER JOIN과(와) 동등합니다. 두 컬렉션의 요소 간에 일치하는 키 값을 기반으로 두 컬렉션을 결합합니다. 쿼리는 키 값이 일치하는 컬렉션 요소의 전체 또는 일부를 반환합니다. 예를 들어 다음 코드는 이전 암시적 조인의 동작을 복제합니다.

Dim vowelNames2 = From student In students
                  Join vowel In vowels
                  On student.Last(0) Equals vowel
                  Select Name = student.First & " " &
                  student.Last, Initial = vowel
                  Order By Initial

Group Join은(는) SQL의 LEFT JOIN과(와) 같이 컬렉션을 단일 계층적 컬렉션과 결합합니다. 자세한 내용은 Join 절Group Join 절을 참조하세요.

데이터 그룹화(Group By)

Group By 절을 추가하여 하나 이상의 요소 필드에 따라 쿼리 결과의 요소를 그룹화할 수 있습니다. 예를 들어 다음 코드는 학생을 졸업 연도별로 그룹화합니다.

Dim studentsByYear = From student In students
                     Select student
                     Group By year = student.Year
                     Into Classes = Group

For Each yearGroup In studentsByYear
    Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
    For Each student In yearGroup.Classes
        Console.WriteLine("   " & student.Last & ", " & student.First)
    Next
Next

방법: 항목 목록 만들기에서 만든 학생 목록을 사용하여 이 코드를 실행하는 경우 For Each 문의 출력은 다음과 같습니다.

3학년

Tucker, Michael

Garcia, Hugo

Garcia, Debra

Tucker, Lance

4학년

Omelchenko, Svetlana

Osada, Michiko

Fakhouri, Fadi

Feng, Hanying

Adams, Terry

1학년

Mortensen, Sven

Garcia, Cesar

다음 코드에 표시된 변형은 학생을 졸업 연도를 정렬한 다음 각 학년 별로 성의 첫 글자의 알파벳 순으로 정렬합니다.

Dim studentsByYear2 = From student In students
                      Select student
                      Order By student.Year, student.Last
                      Group By year = student.Year
                      Into Classes = Group

Group By에 대한 자세한 내용은 Group By 절을 참조하세요.

참고 항목