LINQ を拡張して、任意のデータ ソースを LINQ パターンで照会できるようにするさまざまな方法があります。 データ ソースには、データ構造、Web サービス、ファイル システム、またはデータベースがあります。 LINQ パターンを使用すると、クエリの構文とパターンが変更されないため、クライアントは LINQ クエリが有効になっているデータ ソースに簡単にクエリを実行できます。 LINQ をこれらのデータ ソースに拡張する方法は次のとおりです。
型に IEnumerable<T> インターフェイスを実装して、その型の LINQ to Objects クエリを有効にします。
型を拡張する Where や Select などの標準クエリ演算子メソッドを作成して、その型のカスタム LINQ クエリを有効にします。
IQueryable<T> インターフェイスを実装するデータ ソースのプロバイダーを作成する。 このインターフェイスを実装するプロバイダーは、式ツリーの形式で LINQ クエリを受け取ります。このクエリは、リモートなど、カスタムの方法で実行できます。
既存の LINQ テクノロジを利用するデータ ソースのプロバイダーを作成する。 このようなプロバイダーでは、クエリだけでなく、ユーザー定義型の挿入、更新、削除操作とマッピングも有効になります。
このトピックでは、これらのオプションについて説明します。
データ ソースの LINQ クエリを有効にする方法
データの In-Memory
メモリ内データの LINQ クエリを有効にする方法は 2 つあります。 データが IEnumerable<T>を実装する型の場合は、LINQ to Objects を使用してデータのクエリを実行できます。 IEnumerable<T> インターフェイスを実装して型の列挙を有効にしても意味がない場合は、その型で LINQ 標準クエリ演算子メソッドを定義するか、型を拡張する LINQ 標準クエリ演算子メソッドを作成できます。 標準クエリ演算子のカスタム実装では、遅延実行を使用して結果を返す必要があります。
リモート データ
リモート データ ソースの LINQ クエリを有効にする最適なオプションは、 IQueryable<T> インターフェイスを実装することです。 ただし、これは、データ ソースに対して LINQ to SQL などのプロバイダーを拡張する場合とは異なります。 Visual Studio 2008 では、LINQ to SQL などの既存の LINQ テクノロジを他の種類のデータ ソースに拡張するためのプロバイダー モデルはありません。
IQueryable LINQ プロバイダー
IQueryable<T>を実装する LINQ プロバイダーは、複雑さが大きく異なる場合があります。 このセクションでは、さまざまなレベルの複雑さについて説明します。
あまり複雑でない IQueryable
プロバイダーは、Web サービスの 1 つのメソッドとインターフェイスする場合があります。 この種類のプロバイダーは、処理するクエリ内の特定の情報を必要とするため、非常に具体的です。 閉じた型システムがあり、おそらく単一の結果型を公開します。 クエリの実行のほとんどはローカルで実行されます。たとえば、標準クエリ演算子の Enumerable 実装を使用します。 複雑でないプロバイダーでは、クエリを表す式ツリー内のメソッド呼び出し式を 1 つだけ調べ、クエリの残りのロジックを他の場所で処理できます。
複雑さが中程度の IQueryable
プロバイダーは、部分的に表現力の高いクエリ言語を持つデータ ソースを対象とする場合があります。 Web サービスを対象とする場合は、Web サービスの複数のメソッドとインターフェイスし、クエリが持つ質問に基づいて呼び出すメソッドを選択する可能性があります。 中程度の複雑さのプロバイダーは、単純なプロバイダーよりも豊富な型システムを持っていますが、固定型システムのままです。 たとえば、プロバイダーは、走査可能な一対多リレーションシップを持つ型を公開しますが、ユーザー定義型のマッピング テクノロジは提供しません。
LINQ to SQL プロバイダーなどの複雑な IQueryable
プロバイダーは、完全な LINQ クエリを SQL などの表現力豊かなクエリ言語に変換する場合があります。 複雑なプロバイダーは、クエリでさまざまな質問を処理できるため、より複雑でないプロバイダーよりも一般的です。 また、オープン型システムがあるため、ユーザー定義型をマップするための広範なインフラストラクチャを含める必要があります。 複雑なプロバイダーを開発するには、かなりの労力が必要です。
こちらも参照ください
.NET