使用可觀察的提供者
藉由實作 IQbservable 介面,並使用 Qbservable 類型所提供的處理站擴充方法,您可以撰寫自訂 LINQ 提供者來查詢任何類型的外部資料,以便將這些資料視為可訂閱的序列。 例如,Rx MSDN 開發人員中心的LINQ to WQL 範例示範如何使用 WQL建置簡單的提供者來查詢 WMI 事件。 您可以使用 Qbservable 類型所提供的處理站 LINQ 運算子,來抽象一連串的 WMI 事件和查詢、篩選和撰寫它們。 訂閱此序列會觸發 LINQ 查詢運算式的目的語言翻譯,在此案例中為 WQL。
使用 IQbservable 介面來查詢外部資料
當我們提及我們想要查詢資料時,我們會先擔心我們想要查詢的內容。 這可以是提取式 IEnumerable 集合,或以推送為基礎的非同步 Observable 序列。 我們也想要知道要執行查詢的內容) (的位置。 對於 可觀察 的序列,由 IScheduler 介面及其各種排程器實作類型處理。 最後,我們想要知道如何執行查詢。 我們可以以逐字 (編譯成 .NET 中繼語言的 lambda) 運算式 (代表查詢 (Lambda 運算式 (IL) 程式碼) ,其中查詢中的每個運算子都會以線性方式進行評估。 這是 可觀察 型別的 Factory 運算子方法的情況。 或者,您可以使用運算式樹狀結構來代表查詢查詢,以取得表示的演算法 (例如預測專案是否大於值等) ,然後將演算法轉譯成某些網域特定程式碼,例如 T-SQL 查詢語句,用於查詢 SQL 資料庫、特定 Web 服務 URI 的特定 HTTP 要求、 適用于雲端通知服務的 PowerShell 命令、DSQL 等。這是 Qbservable 型別的 Factory 運算子方法的情況。 轉譯的定義域特定程式碼可以在遠端目標系統中執行,或者您可以使用運算式樹狀結構表示來執行本機查詢優化。
就像 IObservable/IObserver 是 IEnumerable/IEnumerator 的雙重, IQbservable 是 IQueryable 的雙重,並提供 IObservable 查詢的運算式樹狀結構表示。 您可以使用 AsQbservable 和 AsObservable 方法,在 IQbservable 和 IObservable 類型之間變更。 呼叫 AsQbservable 會產生由呼叫原始 IObservable 實例的單一節點所組成的運算式樹狀結構。 此關聯性對於瞭解為何必須從IQbservable 序列開始定義完整的 IQbservable查詢,而且無法直接在現有的IQbservable 查詢上呼叫 AsQbservable來取得。 在下列範例中,只有在您將 IQbservable AsQbservable 套用至資料來源來建置查詢時,對 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 實例相關聯的運算式樹狀結構,而 Provider 則會封裝與資料來源相關聯的查詢提供者。
在 Qbservable類別中宣告的方法集合提供標準查詢運算子的實作,以查詢實作IQbservable的資料來源。 標準查詢運算子是遵循 LINQ 模式的一般用途方法,可讓您針對任何 中的資料表達周遊、篩選和投影作業。以 NET 為基礎的程式設計語言。 此類別中大部分的方法都定義為擴充 IQbservable 類型的擴充方法。 這表示可以在任何實作 IQbservable的物件上呼叫它們,就像實例方法一樣。 這些擴充 IQbservable 的方法不會直接執行任何查詢。 相反地,其功能是建置 Expression 物件,這是代表累積查詢的運算式樹狀結構。 然後,方法會將新的運算式樹狀結構傳遞至 CreateQuery 方法。 目標資料的實際查詢執行是由實作 IQbservable的類別執行。