표준 쿼리 연산자 개요

표준 쿼리 연산자는 LINQ(통합 언어 쿼리) 패턴을 형성하는 메서드입니다. 이러한 메서드는 대부분 시퀀스에서 동작합니다. 여기서 시퀀스란 형식이 IEnumerable<T> 인터페이스나 IQueryable<T> 인터페이스를 구현하는 개체를 말합니다. 표준 쿼리 연산자는 필터링, 프로젝션, 집계, 정렬 등과 같은 쿼리 기능을 제공합니다.

LINQ 표준 쿼리 연산자에는 두 가지 종류가 있는데, 하나는 IEnumerable<T> 형식의 개체에서 동작하고 다른 하나는 IQueryable<T> 형식의 개체에서 동작합니다. 각 종류를 구성하는 메서드는 각각 EnumerableQueryable 클래스의 정적 멤버입니다. 이러한 메서드는 메서드가 동작하는 형식의 확장 메서드로 정의됩니다. 다시 말해 이러한 메서드는 정적 메서드 구문이나 인스턴스 메서드 구문을 사용하여 호출할 수 있다는 것입니다.

또한 몇 가지 표준 쿼리 연산자 메서드는 IEnumerable<T> 또는 IQueryable<T>에 기반을 두지 않은 형식에서 동작합니다. Enumerable 형식은 IEnumerable 형식의 개체에서 동작하는 이러한 메서드 두 개를 정의합니다. 이러한 Cast<TResult>(IEnumerable)OfType<TResult>(IEnumerable) 메서드를 사용하면 LINQ 패턴에서 매개 변수가 없거나 제네릭이 아닌 컬렉션을 쿼리할 수 있습니다. 해당 메서드는 강력한 형식의 개체 컬렉션을 만들어 이러한 쿼리를 수행합니다. Queryable 클래스는 Queryable 형식의 개체에서 동작하는 유사한 메서드 Cast<TResult>(IQueryable)OfType<TResult>(IQueryable)을 정의합니다.

표준 쿼리 연산자는 singleton 값을 반환하는지 값 시퀀스를 반환하는지에 따라 실행 타이밍이 차이가 납니다. singleton 값을 반환하는 이러한 메서드(예: AverageSum)는 즉시 실행됩니다. 시퀀스를 반환하는 메서드는 쿼리 실행을 연기하고 열거 가능한 개체를 반환합니다.

메모리 내 컬렉션에서 동작하는 메서드, 즉 IEnumerable<T>을 확장하는 메서드인 경우 반환된 열거 가능한 개체는 메서드로 전달된 인수를 캡처합니다. 이러한 개체가 열거되면 쿼리 연산자의 논리가 사용되고 쿼리 결과가 반환됩니다.

반대로 IQueryable<T>을 확장하는 메서드는 쿼리 동작을 구현하지 않고 수행할 쿼리를 나타내는 식 트리를 빌드합니다. 쿼리 프로세스는 소스 IQueryable<T> 개체로 처리됩니다.

쿼리 메서드에 대한 호출을 단일 쿼리로 연결할 수 있습니다. 그러나 이렇게 하면 쿼리가 복잡해질 수 있습니다.

다음 코드 예제에서는 표준 쿼리 연산자를 사용하여 시퀀스에 대한 정보를 얻는 방법을 보여 줍니다.

        Dim sentence = "the quick brown fox jumps over the lazy dog"
        ' Split the string into individual words to create a collection.
        Dim words = sentence.Split(" "c)

        Dim query = From word In words 
                    Group word.ToUpper() By word.Length Into gr = Group 
                    Order By Length _
                    Select Length, GroupedWords = gr

        Dim output As New System.Text.StringBuilder
        For Each obj In query
            output.AppendLine(String.Format("Words of length {0}:", obj.Length))
            For Each word As String In obj.GroupedWords
                output.AppendLine(word)
            Next
        Next

        'Display the output
        MsgBox(output.ToString())

        ' This code example produces the following output:
        '
        ' Words of length 3:
        ' THE
        ' FOX
        ' THE
        ' DOG
        ' Words of length 4:
        ' OVER
        ' LAZY
        ' Words of length 5:
        ' QUICK
        ' BROWN
        ' JUMPS 

           string sentence = "the quick brown fox jumps over the lazy dog";
           // Split the string into individual words to create a collection.
           string[] words = sentence.Split(' ');

           // Using query expression syntax.
           var query = from word in words
                       group word.ToUpper() by word.Length into gr
                       orderby gr.Key
                       select new { Length = gr.Key, Words = gr };

           // Using method-based query syntax.
           var query2 = words.
               GroupBy(w => w.Length, w => w.ToUpper()).
               Select(g => new { Length = g.Key, Words = g }).
               OrderBy(o => o.Length);

           foreach (var obj in query)
           {
               Console.WriteLine("Words of length {0}:", obj.Length);
               foreach (string word in obj.Words)
                   Console.WriteLine(word);
           }

           // This code example produces the following output:
           //
           // Words of length 3:
           // THE
           // FOX
           // THE
           // DOG
           // Words of length 4:
           // OVER
           // LAZY
           // Words of length 5:
           // QUICK
           // BROWN
           // JUMPS 

쿼리 식 구문

자주 사용하는 표준 쿼리 연산자 중에는 쿼리 식의 일부로 호출할 수 있는 전용 C# 및 Visual Basic 언어 키워드 구문이 있는 연산자가 있습니다. 전용 키워드가 있는 표준 쿼리 연산자와 해당 구문에 대한 자세한 내용은 표준 쿼리 연산자의 쿼리 식 구문을 참조하십시오.

표준 쿼리 연산자 확장

대상 도메인이나 기술에 적합한 도메인별 메서드를 만들어 표준 쿼리 연산자 집합을 확장할 수 있습니다. 또한 표준 쿼리 연산자를 고유한 구현으로 대체하여 원격 계산, 쿼리 변환 및 최적화와 같은 추가 서비스를 제공할 수도 있습니다. 예제는 AsEnumerable<TSource>을 참조하십시오.

관련 단원

다음은 기능에 따라 다양한 표준 쿼리 연산자에 대한 추가 정보를 제공하는 항목의 링크입니다.

데이터 정렬

집합 작업

데이터 필터링

수량자 작업

프로젝션 작업

데이터 분할

조인 작업

데이터 그룹화

생성 작업

같음 연산

요소 작업

데이터 형식 변환

연결 작업

집계 작업

참고 항목

참조

Enumerable

Queryable

확장 메서드(C# 프로그래밍 가이드)

개념

LINQ 쿼리 소개(C#)

표준 쿼리 연산자의 쿼리 식 구문

실행 방식에 따라 표준 쿼리 연산자 분류

확장 메서드(Visual Basic)