次の方法で共有


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

更新 : 2007 年 11 月

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

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

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

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

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

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

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

インメモリ データ

インメモリ データの 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 サービスの単一のメソッドとやり取りします。たとえば、チュートリアル : IQueryable LINQ プロバイダの作成 トピックで作成したプロバイダはこれに該当します。この種のプロバイダは処理するクエリに特定の情報を受け取るので非常に高い固有性を持ちます。クローズされた型システムを持ち、おそらく 1 つの結果型を公開します。クエリはほとんどの場合、標準クエリ演算子の Enumerable 実装などを使用して、ローカルで実行されます。複雑度が低めのプロバイダは、クエリを表す式ツリーのメソッド呼び出し式を 1 つだけ調べ、残りのクエリのロジックは他の場所で処理されるようにします。

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

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

参照

処理手順

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

概念

標準クエリ演算子の概要

LINQ to Objects

参照

IQueryable<T>

IEnumerable<T>

Enumerable

その他の技術情報

Link to Everything: A List of LINQ Providers