LINQ 쿼리에 대한 데이터 소스 활성화
다양한 방법으로 LINQ를 확장하여 LINQ 패턴에서 원하는 데이터 소스를 쿼리할 수 있습니다.데이터 소스의 예를 몇 가지 들자면 데이터 구조, 웹 서비스, 파일 시스템 또는 데이터베이스가 있습니다.쿼리의 구문과 패턴은 변경되지 않으므로 LINQ 패턴을 사용하면 LINQ 쿼리가 활성화된 데이터 소스를 클라이언트가 쉽게 쿼리할 수 있습니다.다음은 LINQ를 다양한 데이터 소스로 확장할 수 있는 방법입니다.
특정 형식에 이 형식의 LINQ to Objects 쿼리를 활성화하는 IEnumerable<T> 인터페이스 구현
형식을 확장하는 Where 및 Select 같은 표준 쿼리 연산자 메서드를 만들어 해당 형식의 사용자 지정 LINQ 쿼리 활성화
IQueryable<T> 인터페이스를 구현하는 데이터 소스에 대한 공급자 만들기.이 인터페이스를 구현하는 공급자는 원격 실행과 같이 사용자 지정 방식으로 실행할 수 있는 식 트리의 형태로 LINQ 쿼리를 받습니다.
기존 LINQ 기술을 이용하는 데이터 소스에 대한 공급자 만들기.이러한 공급자를 사용하면 쿼리뿐만 아니라 사용자 정의 형식에 대한 삽입, 업데이트 및 삭제 작업과 매핑을 수행할 수 있습니다.
이 항목에서는 이러한 옵션에 대해 설명합니다.
데이터 소스의 LINQ 쿼리를 활성화하는 방법
메모리 내 데이터
메모리 내 데이터의 LINQ 쿼리를 활성화하는 방법에는 두 가지가 있습니다.데이터가 IEnumerable<T>을 구현하는 형식이라면 LINQ to Objects를 사용하여 데이터를 쿼리할 수 있습니다.하지만 IEnumerable<T> 인터페이스를 구현하여 형식의 열거형을 활성화하는 것이 바람직하지 않다면 해당 형식에서 LINQ 표준 쿼리 연산자 메서드를 정의하거나 해당 형식을 확장하는 LINQ 표준 쿼리 연산자 메서드를 만들 수 있습니다.표준 쿼리 연산자의 사용자 지정 구현에서는 지연된 실행을 사용하여 결과를 반환해야 합니다.
원격 데이터
원격 데이터 소스의 LINQ 쿼리를 활성화하는 가장 좋은 방법은 IQueryable<T> 인터페이스를 구현하는 것입니다.하지만 이 방식은 데이터 소스에서 LINQ to SQL 같은 공급자를 확장하는 방식과 다릅니다.LINQ to SQL과 같은 기존 LINQ 기술을 Visual Studio 2008에서 사용할 수 있는 다른 데이터 소스 형식으로 확장하는 공급자 모델은 없습니다.
IQueryable LINQ 공급자
IQueryable<T>을 구현하는 LINQ 공급자의 복잡성은 경우에 따라 크게 다릅니다.이 단원에서는 이러한 복잡성의 차이에 대해 설명합니다.
덜 복잡한 IQueryable 공급자는 웹 서비스의 단일 메서드와 인터페이스할 수도 있습니다.이러한 형식의 공급자는 쿼리에 처리할 특정 정보가 있다고 가정하므로 매우 한정적이며,대개 단일 결과 형식을 노출하는 폐쇄형 형식 시스템을 갖고 있습니다.대부분의 쿼리 실행은 로컬에서 수행됩니다. 예를 들어 표준 쿼리 연산자의 Enumerable 구현을 사용하여 실행됩니다.복잡성이 낮은 공급자는 식 트리에서 쿼리를 나타내는 하나의 메서드 호출 식만 검사하고 쿼리의 나머지 논리는 다른 곳에서 처리되도록 할 수 있습니다.
복잡성이 보통인 IQueryable 공급자는 부분적으로 표현되는 쿼리 언어가 있는 데이터 소스를 대상으로 할 수 있습니다.공급자가 웹 서비스를 대상으로 하는 경우 둘 이상의 웹 서비스 메서드에 대한 인터페이스를 제공하고 쿼리가 노출하는 질문에 따라 호출할 메서드를 선택할 수 있습니다.복잡성이 보통인 공급자는 복잡성이 낮은 공급자보다 풍부한 형식 시스템을 가질 수 있지만 여전히 고정된 형식 시스템을 유지합니다.예를 들어 이 공급자는 이동 가능한 일대다 관계가 있는 형식을 노출할 수 있지만 사용자 정의 형식에 대한 매핑 기술을 제공하지 않습니다.
LINQ to SQL 공급자와 같은 복잡성이 높은 IQueryable 공급자는 완전한 LINQ 쿼리를 SQL과 같이 표현이 가능한 쿼리 언어로 변환할 수 있습니다. 복잡성이 높은 공급자는 쿼리에서 다양한 질문을 처리할 수 있으므로 복잡성이 낮은 공급자보다 사용 범위가 넓습니다.또한 개방형 형식 시스템을 가지므로 사용자 정의 형식을 매핑하는 확장 인프라를 포함해야 합니다.복잡성이 높은 공급자를 개발하려면 상당한 노력이 필요합니다.
고유한 LINQ 공급자를 만드는 방법에 대한 자세한 내용은 MSDN 블로그의 LINQ: Building an IQueryable Provider 및 Link to Everything: A List of LINQ Providers 게시물과 연습: IQueryable LINQ 공급자 만들기 항목을 참조하십시오.