다음을 통해 공유


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 문지역 형식 유추(Visual Basic)를 참조하십시오.

다음 예제에서는 지역 형식 유추를 사용하는 방법을 보여 줍니다. 이 예제를 사용하려면 Option Infer를 On으로 설정해야 합니다.

' 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 Infer가 On 또는 Off인 경우 형식 유추가 발생합니다. Option Infer가 Off이고 Option Strict가 On이면 컴파일 타임 오류가 발생합니다.

' 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

개체 이니셜라이저

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

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

자세한 내용은 개체 이니셜라이저: 명명된 형식과 익명 형식(Visual Basic)을 참조하십시오.

익명 형식

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

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

' 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

자세한 내용은 익명 형식(Visual Basic)을 참조하십시오.

확장 메서드

확장 메서드를 사용하면 정의 외부에서 데이터 형식이나 인터페이스에 메서드를 추가할 수 있습니다. 이 기능을 사용하면 실제로 형식을 수정하지 않고도 기존 형식에 새 메서드를 추가할 수 있습니다. 표준 쿼리 연산자는 그 자체가 IEnumerable을 구현하는 모든 형식에 LINQ 쿼리 기능을 제공하는 확장 메서드 집합입니다. IEnumerable에 대한 다른 확장으로는 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()

자세한 내용은 확장 메서드(Visual Basic)를 참조하십시오.

람다 식

람다 식은 단일 값을 계산하고 반환하는 이름이 없는 함수입니다. 명명된 함수와 달리 람다 식은 동시에 정의하고 실행할 수 있습니다. 다음 예제는 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

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

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

자세한 내용은 람다 식(Visual Basic)을 참조하십시오.

참고 항목

참조

Option Infer 문

Option Strict 문

개념

LINQ 및 문자열

LINQ를 지원하는 C# 기능

기타 리소스

LINQ(통합 언어 쿼리)

Visual Basic에서 LINQ 시작