LINQ to TerraServer 공급자 샘플
업데이트: 2007년 11월
이 샘플은 TerraServer-USA 웹 서비스를 위한 사용자 지정 LINQ 공급자입니다. 이 샘플에는 웹 서비스에서 지리적 데이터를 쿼리하기 위해 해당 사용자 지정 LINQ 공급자를 사용하는 샘플 클라이언트 응용 프로그램도 포함되어 있습니다.
TerraServer-USA 웹 서비스는 특정 위치의 일부 또는 전체 이름을 제공하면 미국 내 해당 위치에 대한 정보를 반환하는 메서드를 제공합니다. GetPlaceList라는 이 메서드는 LINQ 공급자가 LINQ 쿼리를 실행할 대상 데이터를 가져오기 위해 호출하는 메서드입니다. 공급자는 WCF(Windows Communication Foundation)를 사용하여 웹 서비스와 통신합니다. TerraServer-USA 웹 서비스에 대한 자세한 내용은 Overview of the TerraServer-USA Web Services를 참조하십시오.
이 샘플에서와 같이 IQueryable<T> 인터페이스를 구현하는 LINQ 공급자를 사용하면 공급자가 연결하는 데이터 소스를 기준으로 LINQ 쿼리를 작성할 수 있습니다. 즉, 공급자가 데이터 자체에 대해 쿼리 기능을 실행할 수 있을 뿐만 아니라 공급자가 연결하는 데이터 소스에 적합한 쿼리 언어로 LINQ 쿼리를 변환할 수도 있습니다. 이 공급자는 웹 서비스에서 데이터를 가져온 다음 LINQ to Objects에서 쿼리 실행을 처리할 수 있도록 원래 쿼리를 수정합니다.
보안 정보: |
---|
이 샘플 코드는 개념을 설명하기 위한 것으로 개념과 관련된 코드만을 보여 줍니다. 특정 환경에 대한 보안 요구 사항을 충족하지 못 할 수 있고 표시된 그대로 사용하면 안됩니다. 안전하고 강력한 프로젝트를 만들려면 보안 및 오류 처리 코드를 추가하는 것이 좋습니다. Microsoft에서는 어떠한 보증도 없이 “있는 그대로” 이 샘플 코드를 제공합니다. |
샘플 및 이를 설치하기 위한 지침을 가져오려면
다음 중 하나 이상을 수행합니다.
도움말 메뉴에서 샘플을 클릭합니다.
추가 정보 파일에 샘플에 대한 정보가 표시됩니다.
Visual Studio 2008 Samples 웹 사이트를 방문하십시오. 이 웹 사이트에서 최신 버전의 샘플을 다운로드할 수 있습니다.
자세한 내용은 샘플 파일 찾기를 참조하십시오.
참고: |
---|
이 샘플은 온라인으로만 제공받을 수 있습니다. |
Visual Studio에서 클라이언트 응용 프로그램을 실행하려면
Visual Studio에서 LinqToTerraServerProvider.sln 파일을 엽니다.
솔루션 탐색기에서 LinqToTerraServerProvider 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 빌드를 클릭합니다.
디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.
요구 사항
이 샘플을 실행하려면 다음 구성 요소가 필요합니다.
- Visual Studio 2008
세부 항목
이 샘플에서는 IQueryable<T>, IOrderedQueryable<T> 및 IQueryProvider를 구현하는 방법을 보여 줍니다.
디자인 결정
다음 표에서는 LinqToTerraServerProvider 프로젝트에 있는 파일을 보여 줍니다.
파일 |
설명 |
---|---|
Evaluator.cs |
쿼리의 식 트리를 부분적으로 계산합니다. 여기에서 LINQ 쿼리의 모든 지역 변수 참조가 값으로 변환됩니다. |
ExpressionTreeHelpers.cs |
식 트리의 특정 형식에서 데이터에 대한 정보를 확인하고 데이터를 추출하는 데 사용할 수 있는 메서드가 들어 있습니다. |
ExpressionTreeModifier.cs |
완료된 LINQ 쿼리를 나타내는 식 트리를 수정하는 식 트리 방문자 서브클래스입니다. |
ExpressionVisitor.cs |
기본 식 트리 방문자 클래스입니다. |
InnermostWhereFinder.cs |
쿼리의 식 트리에서 가장 안쪽의 Where 메서드 호출을 나타내는 식을 찾는 식 트리 방문자 서브클래스입니다. 이 가장 안쪽 식이 공급자가 검색 위치를 추출하는 식입니다. |
InvalidQueryException.cs |
잘못된 쿼리를 제출할 경우 throw되는 예외를 정의합니다. |
LocationFinder.cs |
LINQ 쿼리에서 웹 서비스 요청에 사용할 위치 정보를 추출하는 식 트리 방문자 서브클래스입니다. 이 클래스는 다음 형식 중 하나로 제공된 위치 정보를 인식합니다.
|
Place.cs |
웹 서비스의 데이터를 나타내는 사용자 지정 .NET 형식을 정의합니다. |
QueryableTerraServerData.cs |
클라이언트 쿼리에서 쿼리를 정의하는 기준이 되는 형식을 포함합니다. 이 형식은 쿼리에서 정렬 작업을 지원하는 IOrderedQueryable<T>을 구현합니다. IOrderedQueryable<T>은 IQueryable<T>에서 파생되므로 이 형식에서 IOrderedQueryable<T>을 구현하면 IQueryable<T>도 구현됩니다. |
TerraServerQueryContext.cs |
쿼리 실행 작업을 구성하는 클래스를 포함합니다. |
TerraServerQueryProvider.cs |
IQueryProvider 인터페이스를 구현하는 형식을 포함합니다. 이 인터페이스가 정의하는 메서드는 Queryable에 정의된 표준 쿼리 연산자 메서드로 호출되어 쿼리를 실행합니다. |
TypeSystem.cs |
이 도우미 클래스는 쿼리 결과를 포함하는 제네릭 컬렉션의 요소 형식을 제공하는 데 사용되는 메서드를 구현합니다. |
WebServiceHelper.cs |
웹 서비스에서 데이터를 가져옵니다. 이 코드에는 공급자 라이브러리의 유용성을 향상시키는 두 가지 검사가 포함됩니다. 첫 번째 검사에서는 웹 서비스를 대상으로 이루어지는 총 호출 수를 쿼리 당 5번으로 제한함으로써 클라이언트 응용 프로그램이 응답을 기다리는 최대 시간을 제한합니다. 두 번째 검사에서는 웹 서비스가 반환하는 결과 수가 웹 서비스가 반환할 수 있는 최대 결과 수와 동일한지 확인합니다. 결과 수가 최대 수와 같으면 웹 서비스의 결과가 잘린 것일 수도 있습니다. 따라서 공급자는 클라이언트로 불완전한 목록을 반환하는 대신 예외를 throw합니다. |
다음 표에서는 ClientApp 프로젝트에 있는 파일을 보여 줍니다.
파일 |
설명 |
---|---|
Program.cs |
LinqToTerraServerProvider 프로젝트에 정의되어 있는 QueryableTerraServerData 형식을 쿼리하는 세 가지 예제 LINQ 쿼리를 포함합니다. |
app.config |
응용 프로그램과 웹 서비스의 통신 방법을 정의하는 끝점을 포함합니다. |
이 사용자 지정 LINQ 공급자를 디자인하는 방법에 대한 자세한 내용은 연습: IQueryable LINQ 공급자 만들기를 참조하십시오.