다음을 통해 공유


LINQ를 지원하는 Visual Basic 기능

LINQ(Language-Integrated Query)라는 이름은 쿼리 구문 및 기타 언어 구문을 언어로 직접 지원하는 Visual Basic의 기술을 나타냅니다. LINQ를 사용하면 외부 데이터 원본에 대해 쿼리할 새 언어를 배울 필요가 없습니다. Visual Basic을 사용하여 관계형 데이터베이스, XML 저장소 또는 개체의 데이터에 대해 쿼리할 수 있습니다. 쿼리 기능을 언어에 통합하면 컴파일 시간에 구문 오류 및 형식 안전성을 검사할 수 있습니다. 또한 이 통합을 통해 Visual Basic에서 풍부하고 다양한 쿼리를 작성하기 위해 알아야 할 사항의 대부분을 이미 알고 있습니다.

다음 섹션에서는 LINQ를 지원하는 언어 구문을 자세히 설명하여 소개 설명서, 코드 예제 및 샘플 애플리케이션 읽기를 시작할 수 있도록 합니다. 링크를 클릭하여 언어 기능을 함께 사용하여 언어 통합 쿼리를 사용하도록 설정하는 방법에 대한 자세한 설명을 찾을 수도 있습니다. 연습: Visual Basic에서 쿼리 작성으로 시작하면 좋습니다.

쿼리 식

Visual Basic의 쿼리 식은 SQL 또는 XQuery와 유사한 선언적 구문으로 표현할 수 있습니다. 컴파일 시간에 쿼리 구문은 LINQ 공급자의 표준 쿼리 연산자 확장 메서드 구현에 대한 메서드 호출로 변환됩니다. 애플리케이션은 Imports 문을 사용하여 적절한 네임스페이스를 지정하여 범위에 있는 표준 쿼리 연산자를 제어합니다. Visual Basic 쿼리 식의 구문은 다음과 같습니다.

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

자세한 내용은 Visual Basic의 LINQ 쿼리 소개를 참조하세요.

암시적으로 형식화된 변수

변수를 선언하고 초기화할 때 형식을 명시적으로 지정하는 대신 컴파일러가 형식을 유추하고 할당하도록 설정할 수 있습니다. 이를 로컬 형식 유추라고 합니다.

형식이 유추되는 변수는 명시적으로 지정하는 형식의 변수와 마찬가지로 강력한 형식입니다. 로컬 형식 유추는 메서드 본문 내에서 지역 변수를 정의하는 경우에만 작동합니다. 자세한 내용은 Option Infer 문로컬 형식 유추를 참조하세요.

다음 예제에서는 로컬 형식 유추를 보여 줍니다. 이 예제를 사용하려면 Option InferOn으로 설정해야 합니다.

' The variable aNumber will be typed as an integer.
Dim aNumber = 5

' The variable aName will be typed as a String.
Dim aName = "Virginia"

또한 로컬 형식 유추를 사용하면 무명 형식을 만들 수 있습니다. 이 형식은 이 섹션의 뒷부분에서 설명하고 LINQ 쿼리에 필요합니다.

다음 LINQ 예제에서 형식 유추는 Option InferOn 또는 Off인 경우에 발생합니다. 컴파일 시간 오류는 Option InferOff이고 Option StrictOn인 경우에 발생합니다.

' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.

Dim numQuery = From num In numbers
               Where num Mod 2 = 0
               Select num

개체 이니셜라이저

개체 이니셜라이저는 쿼리 결과를 보관하기 위해 무명 형식을 만들어야 하는 경우 쿼리 식에 사용됩니다. 쿼리 외부에서 명명된 형식의 개체를 초기화하는 데 사용할 수도 있습니다. 개체 이니셜라이저를 사용하면 생성자를 명시적으로 호출하지 않고 한 줄로 개체를 초기화할 수 있습니다. 공용 NamePhone 속성이 있는 Customer라는 클래스가 다른 속성과 함께 있다고 가정하면 다음과 같은 방식으로 개체 이니셜라이저를 사용할 수 있습니다.

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

자세한 내용은 개체 이니셜라이저: 명명된 형식 및 무명 형식을 참조하세요.

익명 형식

무명 형식은 속성 집합을 쿼리 결과에 포함하려는 요소로 일시적으로 그룹화할 수 있는 편리한 방법을 제공합니다. 이렇게 하면 요소의 명명된 데이터 형식을 정의하지 않고 쿼리에서 사용 가능한 필드의 조합을 어떤 순서로도 선택할 수 있습니다.

무명 형식은 컴파일러에 의해 동적으로 생성됩니다. 형식의 이름은 컴파일러에 의해 할당되며 새 컴파일마다 변경될 수 있습니다. 따라서 이름을 직접 사용할 수 없습니다. 무명 형식은 다음과 같은 방법으로 초기화됩니다.

' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}

' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Select cust.Name, cust.Phone

' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Select CustomerName = cust.Name,
                   CustomerPhone = cust.Phone

자세한 내용은 무명 형식을 참조하세요.

확장명 메서드

확장 메서드를 사용하면 정의 외부에서 데이터 형식 또는 인터페이스에 메서드를 추가할 수 있습니다. 이 기능을 사용하면 실제로 형식을 수정하지 않고 기존 형식에 새 메서드를 추가할 수 있습니다. 표준 쿼리 연산자는 IEnumerable<T>를 구현하는 모든 형식에 대해 LINQ 쿼리 기능을 제공하는 확장 메서드 집합입니다. IEnumerable<T>에 대한 다른 확장에는 Count, UnionIntersect가 포함됩니다.

다음 확장 메서드는 String 클래스에 인쇄 메서드를 추가합니다.

' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
Public Sub Print(ByVal str As String)
    Console.WriteLine(str)
End Sub

메서드는 다음과 같은 String의 일반 인스턴스 메서드처럼 호출됩니다.

Dim greeting As String = "Hello"
greeting.Print()

자세한 내용은 확장 메서드를 참조하세요.

람다 식

람다 식은 단일 값을 계산하고 반환하는 이름이 없는 함수입니다. 명명된 함수와 달리 람다 식을 동시에 정의하고 실행할 수 있습니다. 다음 예제에서는 4를 표시합니다.

Console.WriteLine((Function(num As Integer) num + 1)(3))

변수 이름에 람다 식 정의를 할당한 다음, 이 이름을 사용하여 함수를 호출할 수 있습니다. 다음 예제에서는 4를 표시합니다.

Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))

LINQ에서 람다 식은 많은 표준 쿼리 연산자의 기반이 됩니다. 컴파일러는 람다 식을 만들어 Where, Select, Order By, Take While 등과 같은 기본 쿼리 메서드에 정의된 계산을 캡처합니다.

예를 들어 다음 코드는 학생 목록에서 모든 상급생을 반환하는 쿼리를 정의합니다.

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

쿼리 정의는 두 개의 람다 식을 사용하여 WhereSelect에 대한 인수를 지정하는 다음 예제와 유사한 코드로 컴파일됩니다.

Dim seniorsQuery2 = students.
    Where(Function(st) st.Year = "Senior").
    Select(Function(s) s)

두 버전 모두 For Each 루프를 사용하여 실행할 수 있습니다.

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

자세한 내용은 람다 식을 참조하세요.

참고 항목