データ ソースの LINQ クエリの有効化

LINQ を拡張して、データ ソースを LINQ パターンでクエリできるようにする方法はいくつかあります。データ ソースは、いくつか例を挙げると、データ構造体、Web サービス、ファイル システム、またはデータベースの場合があります。クエリの構文とパターンは変わらないため、LINQ パターンを使用すると、クライアントは LINQ クエリが有効になっているデータ ソースを簡単にクエリできます。LINQ は、次の方法によってこれらのデータ ソースに拡張することができます。

  • 型に IEnumerable<T> インターフェイスを実装し、その型の LINQ to Objects クエリを有効にする。

  • 型を拡張する WhereSelect などの標準クエリ演算子メソッドを作成し、その型のカスタム LINQ クエリを有効にする。

  • データ ソース用に、IQueryable<T> インターフェイスを実装したプロバイダーを作成する。このインターフェイスを実装したプロバイダーは、式ツリーの形式で LINQ クエリを受け取ります。プロバイダーはこれをカスタマイズされた方法 (たとえばリモート) で実行できます。

  • データ ソース用に、既存の LINQ テクノロジを利用するプロバイダーを作成する。そのようなプロバイダーは、クエリだけでなく、挿入、更新、および削除などの操作や、ユーザー定義型のマッピングも有効にします。

このトピックでは、これらのオプションについて説明します。

データ ソースの LINQ クエリを有効にする方法

Bb882640.collapse_all(ja-jp,VS.110).gifインメモリ データ

インメモリ データの LINQ クエリを有効にする方法は 2 つあります。データ型が IEnumerable<T> を実装する型の場合、LINQ to Objects を使用してデータをクエリすることができます。IEnumerable<T> インターフェイスを実装して型の列挙体を有効にしても意味がない場合は、その型の LINQ 標準クエリ演算子メソッドを定義するか、または型を拡張する LINQ 標準クエリ演算子メソッドを作成することができます。標準クエリ演算子のカスタム実装は、結果を返すために遅延実行を使用する必要があります。

Bb882640.collapse_all(ja-jp,VS.110).gifリモート データ

リモート データ ソースの 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 サービスの複数のメソッドとやり取りし、クエリが提示する問題に基づいて呼び出すメソッドを選択します。中レベルの複雑度のプロバイダーは、簡単なプロバイダーより型システムが豊富ですが、それでもその種類は限られています。たとえば、このレベルのプロバイダーは走査できる一対多リレーションシップを持つ型を公開する場合がありますが、ユーザー定義型のマッピング テクノロジは提供しません。

複雑な IQueryable プロバイダーの例としては、LINQ to SQL プロバイダーがあります。これは、完全な LINQ クエリを SQL などの表現力が豊かなクエリ言語に変換します。複雑なプロバイダーはクエリの幅広い問題を処理することができるので、複雑度が低めのプロバイダーより一般的です。さらに、オープンな型システムを持つため、ユーザー定義型をマップするために広範なインフラストラクチャを含める必要があります。複雑なプロバイダーの開発には、多大な労力を要します。

独所の LINQ プロバイダーを作成する方法については、「チュートリアル : IQueryable LINQ プロバイダーの作成」、および MSDN ブログの「LINQ: Building an IQueryable Provider (LINQ: IQueryable プロバイダーの作成)」と「Link to Everything: A List of LINQ Providers (Link to Everything: LINQ プロバイダーの一覧)」を参照してください。

参照

処理手順

チュートリアル : IQueryable LINQ プロバイダーの作成

関連項目

IQueryable<T>

IEnumerable<T>

Enumerable

概念

標準クエリ演算子の概要

LINQ to Objects

その他の技術情報

LINQ: Building an IQueryable Provider (LINQ: IQueryable プロバイダーの作成)

Link to Everything: A List of LINQ Providers (Link to Everything: LINQ プロバイダーの一覧)