[36] 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라

다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.

 

 

 

C# 컴파일러는 LINQ의 쿼리 표현식과 메서드 호출 구문으로 변환한다.

C#은 쿼리 표현식 패턴에 포함된 개별 메서드의 의미를 전혀 개의치 않는다.

 

Where

필터 이상의 역할을 수행하지 않는다.

where n < 5
numbers.Where(n => n < 5);

 

Select

입력값을 다른 타입으로 변환하는 용도로 사용된다.

입력 시퀀스 내의 개별 요소에 대해 각기 새로운 타입의 객체를 생성하여 출력 시퀀스로 내보내지만 요소들을 수정해서는 안된다.

var squares = from n in numbers
              select new { Number = n, Square = n * n };
var squares = numbers.Select(n =>
              new { Number = n, Square = n * n });

 

OrderBy, ThenBy

입력값을 정렬한다.

var people = from e in employees
             where e.Age > 30
             orderby e.LastName, e.FirstName, e.Age
             select e;
var people = employees.Where(e => e.Age > 30).
             OrderBy(e => e.LastName).
             ThenBy(e => e.FirstName).
             ThenBy(e => e.Age);

orderby절을 각각 쓰면 ThenBy가 아니라 OrderBy를 각각 실행돼버려서 앞 두 개는 의미 없어지니 주의.

var people = from e in employees
             where e.Age > 30
             orderby e.LastName
             orderby e.FirstName
             orderby e.Age
             select e;
var people = employees.Where(e => e.Age > 30).
             OrderBy(e => e.LastName).
             OrderBy(e => e.FirstName).
             OrderBy(e => e.Age);

내림차순 정렬은 다음과 같이 지정할 수 있다.

var people = from e in employees
             where e.Age > 30
             orderby e.LastName decending, e.FirstName, e.Age
             select e;

 

group into

개별 요소로 하나의 키와 값의 리스트를 쌍으로 갖는 시퀀스를 생성한다.

var results = from e in employees
              group e by e.Department into d
              select new
              {
                  Department = d.Key,
                  Size = d.Count()
              };

우선 변환작업에 앞서 group into 구문을 중첩쿼리로 변환한다.

var results = from d in
              from e in employees group e by e.Department
              select new {
              Department = d.Key,
              Size = d.Count()};

이를 메서드 호출 구문으로 변환한다. 

var results = employees.GroupBy(e => e.Department).
                       Select(d => new { Department = d.Key, Size = d.Count() });

 

결론

 - 쿼리표현식이 메서드 호출 구문으로 변환되는 과정을 알아둔다면

   사용자 정의 공급자를 만들어볼 수도 있다.

 

 

댓글

Designed by JB FACTORY