표준 쿼리 연산자 개요
표준 쿼리 연산자는 LINQ(통합 언어 쿼리) 패턴을 형성하는 메서드입니다. 이러한 메서드는 대부분 시퀀스에서 동작합니다. 여기서 시퀀스란 형식이 IEnumerable<T> 인터페이스나 IQueryable<T> 인터페이스를 구현하는 개체를 말합니다. 표준 쿼리 연산자는 필터링, 프로젝션, 집계, 정렬 등과 같은 쿼리 기능을 제공합니다.
LINQ 표준 쿼리 연산자에는 두 가지 종류가 있는데, 하나는 IEnumerable<T> 형식의 개체에서 동작하고 다른 하나는 IQueryable<T> 형식의 개체에서 동작합니다. 각 종류를 구성하는 메서드는 각각 Enumerable 및 Queryable 클래스의 정적 멤버입니다. 이러한 메서드는 메서드가 동작하는 형식의 확장 메서드로 정의됩니다. 다시 말해 이러한 메서드는 정적 메서드 구문이나 인스턴스 메서드 구문을 사용하여 호출할 수 있다는 것입니다.
또한 몇 가지 표준 쿼리 연산자 메서드는 IEnumerable<T> 또는 IQueryable<T>에 기반을 두지 않은 형식에서 동작합니다. Enumerable 형식은 IEnumerable 형식의 개체에서 동작하는 이러한 메서드 두 개를 정의합니다. 이러한 Cast<TResult>(IEnumerable) 및 OfType<TResult>(IEnumerable) 메서드를 사용하면 LINQ 패턴에서 매개 변수가 없거나 제네릭이 아닌 컬렉션을 쿼리할 수 있습니다. 해당 메서드는 강력한 형식의 개체 컬렉션을 만들어 이러한 쿼리를 수행합니다. Queryable 클래스는 Queryable 형식의 개체에서 동작하는 유사한 메서드 Cast<TResult>(IQueryable) 및 OfType<TResult>(IQueryable)을 정의합니다.
표준 쿼리 연산자는 singleton 값을 반환하는지 값 시퀀스를 반환하는지에 따라 실행 타이밍이 차이가 납니다. singleton 값을 반환하는 이러한 메서드(예: Average 및 Sum)는 즉시 실행됩니다. 시퀀스를 반환하는 메서드는 쿼리 실행을 연기하고 열거 가능한 개체를 반환합니다.
메모리 내 컬렉션에서 동작하는 메서드, 즉 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>을 참조하십시오.
관련 단원
다음은 기능에 따라 다양한 표준 쿼리 연산자에 대한 추가 정보를 제공하는 항목의 링크입니다.