다음 예제에서는 간단한 쿼리 식 및 메서드 기반 쿼리로 작성된 의미가 같은 쿼리를 보여 줍니다.
class QueryVMethodSyntax
{
static void Main()
{
int[] numbers = { 5, 10, 8, 3, 6, 12};
//Query syntax:
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
//Method syntax:
IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
foreach (int i in numQuery1)
{
Console.Write(i + " ");
}
Console.WriteLine(System.Environment.NewLine);
foreach (int i in numQuery2)
{
Console.Write(i + " ");
}
// Keep the console open in debug mode.
Console.WriteLine(System.Environment.NewLine);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
/*
Output:
6 8 10 12
6 8 10 12
*/
두 예제의 출력은 동일합니다. 쿼리 변수의 형식이 두 경우 모두에서 IEnumerable<(Of <(T>)>)로 동일하다는 것을 알 수 있습니다.
메서드 기반 쿼리를 이해하기 위해 좀더 자세히 살펴보도록 하겠습니다. 식의 오른쪽에서 where 절은 이제 numbers 개체에 대한 인스턴스 메서드로 표현되며 해당 형식은 IEnumerable<int>입니다. 제네릭 IEnumerable<(Of <(T>)>) 인터페이스에 익숙한 경우 Where 메서드가 없다는 것을 알고 있을 것입니다. 그러나 Visual Studio IDE에서 IntelliSense 완성 목록을 호출할 경우 Where 메서드뿐만 아니라 Select, SelectMany, Join 및 Orderby와 같은 다른 많은 메서드를 보게 됩니다. 이러한 메서드는 모두 표준 쿼리 연산자입니다.
.png)
IEnumerable<(Of <(T>)>)이 이러한 추가 메서드를 포함하도록 다시 정의된 것처럼 보이지만 실제로는 그렇지 않습니다. 표준 쿼리 연산자는 확장 메서드라는 새로운 종류의 메서드로 구현됩니다. 확장 메서드는 기존 "형식"을 확장하므로 해당 형식에 대한 인스턴스 메서드인 것처럼 호출될 수 있습니다. 표준 쿼리 연산자가 IEnumerable<(Of <(T>)>)을 확장하기 때문에 사용자는 numbers.Where(...)를 작성할 수 있습니다.
LINQ를 사용하려면 올바른 using 지시문을 사용하여 확장 메서드를 응용 프로그램의 범위에 가져오는 방법만 알면 됩니다. 이 방법은 방법: LINQ 프로젝트 만들기에 자세히 설명되어 있습니다. 응용 프로그램의 관점에서 보면 확장 메서드와 일반 인스턴스 메서드는 동일합니다.
확장 메서드에 대한 자세한 내용은 확장 메서드(C# 프로그래밍 가이드)를 참조하십시오. 표준 쿼리 연산자에 대한 자세한 내용은 LINQ 일반 프로그래밍 가이드 및 표준 쿼리 연산자 개요를 참조하십시오. LINQ to SQL 및 LINQ to XML과 같은 일부 LINQ 공급자는 IEnumerable<(Of <(T>)>) 외에 다른 형식을 위한 고유한 표준 쿼리 연산자와 추가 확장 메서드를 구현합니다.