監視可能プロバイダーの使用

IQbservable インターフェイスを実装し、Qbservable 型によって提供されるファクトリ拡張メソッドを使用することで、任意の種類の外部データに対してクエリを実行するカスタム LINQ プロバイダーを作成して、これらのデータをサブスクライブ可能なシーケンスとして扱うことができます。 たとえば、Rx MSDN デベロッパー センターLINQ to WQL サンプルでは、WQL を使用して WMI イベントに対してクエリを実行するための単純なプロバイダーを構築する方法が示されています。 Qbservable 型によって提供されるファクトリ LINQ 演算子を使用して、WMI イベントのシーケンスを抽象化し、クエリを実行し、フィルター処理して構成できます。 このシーケンスをサブスクライブすると、ターゲット言語 (この場合は WQL) への LINQ クエリ式の変換がトリガーされます。 

IQbservable インターフェイスを使用した外部データのクエリ

データに対してクエリを実行することをメンションすると、まずクエリ対象が気になります。 プルベースの IEnumerable コレクション、またはプッシュベースの非同期 Observable シーケンスを指定できます。 また、(どのコンテキストの下で) クエリを実行するかを知りたい場合もあります。 Observable シーケンスの場合、IScheduler インターフェイスとそのさまざまな Scheduler 実装型によって処理されます。 最後に、クエリの実行方法を知りたいです。 クエリ (ラムダ式) を逐語的 (.NET 中間言語 (IL) コードにコンパイル) で表すことができます。このコードでは、クエリ内の各演算子が線形的に評価されます。 これは、 Observable 型のファクトリ演算子メソッドの場合です。 または、式ツリーを使用してクエリを表すことができます。これは、表現されたアルゴリズムを取得するために走査できます (たとえば、項目が値より大きいかどうかを予測するなど)、そのアルゴリズムを、SQL データベースにクエリを実行するための T-SQL クエリ ステートメント、特定の Web サービス URI に対する特定の HTTP 要求など、ドメイン固有のコードに変換します。 PowerShell コマンド、クラウド通知サービスの DSQL などこれは、 Qbservable 型のファクトリ演算子メソッドの場合です。 翻訳されたドメイン固有のコードは、リモート ターゲット システムで実行することも、式ツリー表現を使用してローカル クエリの最適化を実行することもできます。

IObservable/IObserver が IEnumerable/IEnumerator のデュアルであるのと同様に、 IQbservableIQueryable のデュアルであり、IObservable クエリの式ツリー表現を提供します。 AsQbservable メソッドと AsObservable メソッドを使用して、IQbservable 型と IObservable 型を変更できます。 AsQbservable を呼び出すと、元の IObservable インスタンスを呼び出す 1 つのノードで構成される式ツリーが生成されます。 この関係は、IQbservable シーケンスから始まる完全な IQbservable クエリを定義する必要があり、既存のIQbservable クエリで AsQbservable を呼び出すだけでは取得できない理由を理解するために重要です。 次の例では、AsQbservable を呼び出すと、データ ソースに IQbservable AsQbservable を適用してクエリをビルドした場合にのみ、完全なクエリ ツリーが生成されます。

var source = Observable.Interval(TimeSpan.FromSeconds(1));
var q = source.AsQbservable();
Console.WriteLine(q.ToString());
var sub = q.Subscribe(Console.WriteLine);
Console.ReadKey();

IQbservable インターフェイスは、クエリ プロバイダーによる実装を目的としています。 IQbservable<T> も実装するプロバイダーによってのみ実装されます。 プロバイダーが IQbservable<T> も実装していない場合、プロバイダーのデータ ソースで標準のクエリ演算子を使用することはできません。 IQbservable インターフェイスは IObservable インターフェイスを継承するため、クエリを表す場合は、そのクエリの結果をサブスクライブできます。 サブスクリプションとパブリケーションにより、 Qbservable オブジェクトに関連付けられている式ツリーが実行されます。 "式ツリーの実行" の定義は、クエリ プロバイダーに固有です。 たとえば、基になるデータ ソースの適切なクエリ言語に式ツリーを変換する必要がある場合があります。 Expression プロパティは 、IQbservable インスタンスに関連付けられている式ツリーをカプセル化しますが、プロバイダーはデータ ソースに関連付けられているクエリ プロバイダーをカプセル化します。

Qbservable クラスで宣言された一連のメソッドは、IQbservable を実装するデータ ソースに対してクエリを実行するための標準クエリ演算子の実装を提供します。 標準のクエリ演算子は、LINQ パターンに従う汎用メソッドであり、任意の 内のデータに対してトラバーサル、フィルター処理、プロジェクション操作を表現できます。NET ベースのプログラミング言語。 このクラスのメソッドの大部分は、 IQbservable 型を拡張する拡張メソッドとして定義されています。 つまり、 IQbservable を実装する任意のオブジェクトで、インスタンス メソッドのように呼び出すことができます。 IQbservable を拡張するこれらのメソッドは、クエリを直接実行しません。 代わりに、その機能は、累積クエリを表す式ツリーである Expression オブジェクトをビルドすることです。 その後、メソッドは新しい式ツリーを CreateQuery メソッドに渡します。 ターゲット データに対する実際のクエリ実行は、 IQbservable を実装するクラスによって実行されます。

参照

リファレンス

IQbservable
Qbservable

その他の参照情報

Rx MSDN デベロッパー センター