다음을 통해 공유


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에서 클라이언트 응용 프로그램을 실행하려면

  1. Visual Studio에서 LinqToTerraServerProvider.sln 파일을 엽니다.

  2. 솔루션 탐색기에서 LinqToTerraServerProvider 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.

요구 사항

이 샘플을 실행하려면 다음 구성 요소가 필요합니다.

  • 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.Name == "Seattle" 같은 동등 식

  • place.Name.StartsWith("Seat") 같은 StartsWith 메서드에 대한 메서드 호출 식

  • placeList.Contains(place.Name) 같은 Enumerable.ContainsList<T>.Contains 메서드에 대한 메서드 호출 식

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 공급자 만들기를 참조하십시오.

참고 항목

작업

방법: 식 트리 방문자 구현

기타 리소스

LINQ C# 샘플