LINQ to TerraServer プロバイダのサンプル

更新 : 2007 年 11 月

このサンプルは、TerraServer-USA Web サービスに対応するカスタム LINQ プロバイダです。カスタム LINQ プロバイダを使用して Web サービスに地理データを照会するサンプル クライアント アプリケーションも含まれています。

TerraServer-USA Web サービスは、場所の名前の一部または全体を指定すると、米国内の場所に関する情報を返すメソッドを公開しています。GetPlaceList という名前のこのメソッドは、LINQ クエリの実行対象データを取得するために LINQ プロバイダによって呼び出されます。プロバイダと Web サービスの通信には、Windows Communication Foundation (WCF) が使用されます。TerraServer-USA Web サービスの詳細については、「Overview of the TerraServer-USA Web Services」を参照してください。

このプロバイダのように、IQueryable<T> インターフェイスを実装する LINQ プロバイダを使用すると、プロバイダの接続先データ ソースに対する LINQ クエリを作成できます。プロバイダでは、データ自体に対してクエリ機能を実行する場合もあれば、LINQ クエリを接続先データ ソースに適したクエリ言語に変換する場合もあります。このプロバイダは、Web サービスからデータを取得し、元のクエリを変更して、LINQ to Objects がクエリの実行を処理できるようにします。

セキュリティに関するメモ :

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

サンプルとそのインストール手順を取得するには

  • 次のいずれかを実行します。

    • [ヘルプ] メニューの [サンプル] をクリックします。

      サンプルについての情報が Readme に表示されます。

    • Visual Studio 2008 のサンプルの Web サイトにアクセスします。最新のサンプルを参照できます。

詳細については、「サンプル ファイルの格納場所」を参照してください。

メモ :

このサンプルは、オンラインでのみ使用できます。

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

無効なクエリが送信された場合にスローされる例外を定義します。

LocationFinder.cs

Web サービス要求で使用する場所情報を LINQ クエリから抽出する式ツリー ビジタ サブクラスです。このクラスは、次のいずれかの形式で提供された場所情報を認識します。

  • place.Name == "Seattle" などの等価式。

  • place.Name.StartsWith("Seat") など、StartsWith メソッドのメソッド呼び出し式。

  • placeList.Contains(place.Name) など、Enumerable.Contains メソッドおよび List<T>.Contains メソッドのメソッド呼び出し式。

Place.cs

Web サービスのデータを表すカスタム .NET 型を定義します。

QueryableTerraServerData.cs

クライアント クエリがクエリを定義する対象の型が含まれています。この型は、IOrderedQueryable<T> を実装して、クエリ内での並べ替え操作をサポートします。IOrderedQueryable<T>IQueryable<T> から派生するため、IOrderedQueryable<T> を実装することにより、この型は IQueryable<T> も実装します。

TerraServerQueryContext.cs

クエリの実行作業を整理するクラスが含まれています。

TerraServerQueryProvider.cs

IQueryProvider インターフェイスを実装する型が含まれています。このインターフェイスで定義されるメソッドは、クエリを実行するために、Queryable で定義されている標準クエリ演算子メソッドによって呼び出されます。

TypeSystem.cs

このヘルパー クラスは、クエリ結果を含むジェネリック コレクションの要素型を作成するために使用されるメソッドを実装します。

WebServiceHelper.cs

Web サービスからデータを取得します。このコードには、プロバイダ ライブラリを使いやすくする 2 つのチェックが含まれます。最初のチェックでは、1 つのクエリにつき Web サービスに対して行われる呼び出しの合計数を 5 つに制限して、クライアント アプリケーションが応答を待機する最大時間を制限します。2 番目のチェックでは、Web サービスによって返された結果の数が、返すことのできる結果の最大数と同じかどうかを確認します。結果の数が最大数である場合、Web サービスからの結果が切り捨てられている可能性があります。プロバイダは、クライアントに不完全なリストを返すのではなく、例外をスローします。

ClientApp プロジェクト内のファイルの一覧を次の表に示します。

ファイル

説明

Program.cs

LinqToTerraServerProvider プロジェクトで定義されている QueryableTerraServerData 型を照会する 3 つの LINQ クエリ例が含まれています。

app.config

アプリケーションが Web サービスと通信する方法を定義するエンドポイントが含まれています。

このカスタム LINQ プロバイダのデザインの詳細については、「チュートリアル : IQueryable LINQ プロバイダの作成」を参照してください。

参照

処理手順

方法 : 式ツリー ビジタを実装する

その他の技術情報

LINQ C# のサンプル