본문 바로가기

IT 살이/04. 기술 - 프로그래밍

LINQ 시리즈 11 - LINQ 마구잡이 마무리

앞에서 쿼리 표현식의 where는 C#의 Where 메소드로 변환된다고 했다. 즉 LINQ 쿼리는 몇 개의 쿼리용 오퍼레이터로 구성된다. 그리고 그 쿼리용 오퍼레이터는 IEnumerable<T>를 구현하는 어떤 타입들의 확장 메소드들이다. IEnumerable<T>를 구현하는 모든 타입의 객체에 대해서 Where 메소드를 호출할 수 있다는 것이다.

LINQ 쿼리가 이런 확장 메소드들을 기반으로 하고 있다는 것은 매우 확장적이다. 확장스럽다. 확장답다^^ 확장!확장! 기본적으로 지금 C#3.0에서부터 제공하고 있는 쿼리용 오퍼레이터들은 IEnumerable<T>를 확장한 메소드들이다. 현재도 많은 리스트 타입들이 IEnumerable<T> 인터페이스를 구현하고 있기때문에, 이런 확장 메소드를 사용하는 방법은 LINQ를 일반적인 쿼리용 프레임워크가 될 수 있게 한다.

그러나 쿼리 대상이 되는 데이터가 다른 타입이라면 그 타입에 맞는 확장 메소드들만 제공하면 얼마든지 확장 즉 특화가 가능하다는 것이다. LINQ to SQL, LINQ to XML은 관계형 데이터와 XML 노드 데이터를 핸들링하기 위한 특화된 확장 메소드들을 사용하고 있다. 지금까지 설명하면서 사용했던 IEnumerable<T> 타입의 확장 메소들은 LINQ to Objects 용 메소드들이이었다. 이쯤해서 얼떨결에 배웠던 확장 메소드가 LINQ에서 얼마나 중요한 개념인지를 알 수 있게 된다. 확장 메소드에 대한 포스트를  다시 한번 더 훑어봐도 시간낭비일 것 같지 않은 기분이 팍팍든다.

앞에서 LINQ to Objects용 확장 메소드들은 System.Linq 네임스페이스에 있는 정적 클래스 Enumerable에 정의되어 있다고 했었다. 앞에서도 말했지만 쿼리 표현식은 모두 C#의 확장 메소드로 변환시킬 수 있다. 그러나 모든 확장 메소드를 LINQ 쿼리 표현으로 변환할 수 있는 것은 아니다. 따라서 두가지 표현을 모두 이해하는 것이 바람직하다.

이 포스트에서는 조인과 그룹핑 그리고 정렬 정도의 기본 개념을 어떻게 표현하는지를 알아보려했으나 이제 좀 지겹다. 그래서 다음 한용희 MVP님의 포스트를 소개하겠다.  동영상이 많다. 좋은 블로그이다.

http://blog.naver.com/woom333/60047172335

다음은 영어로 되어 있는 포스트이다.

Express Yourself with C#'s Query Syntax(http://visualstudiomagazine.com/columns/article.aspx?editorialsid=2461)