使用可觀察的提供者

  通過實現IQbservable接口並使用Qbservable類型提供的工廠擴展方法,您可以編寫自定義LINQ提供程序來查詢任何類型的外部數據,以便將這些數據視爲可訂閱的序列。例如,Rx MSDN開發人員中心中的LINQ to WQL示例展示瞭如何構建一個簡單的提供程序,以便使用WQL查詢WMI事件。您可以使用Qbservable類型提供的工廠LINQ運算符抽象WMI事件的序列並進行查詢,過濾和組合。訂閱此序列將觸發將LINQ查詢表達式轉換爲目標語言(在本例中爲WQL)。

使用IQbservable接口查詢外部數據

  當我們提到我們想要查詢數據時,我們首先關心我們要查詢什麼。這可以是基於pull的IEnumerable集合或基於推的異步Observable序列。我們還想知道我們要在哪裏(在哪個上下文)執行查詢。對於可觀察序列,由IScheduler接口及其各種調度程序實現類型處理。最後,我們想知道我們如何做查詢。我們可以逐字地(編譯成.NET中間語言(IL)代碼)表示查詢(lambda表達式),其中查詢中的每個運算符將以線性方式被求值。這是Observable類型的工廠操作符方法的情況。或者,您可以使用表達式樹來表示查詢,可以遍歷以獲取表示的算法(例如,預測項目是否大於某個值等),然後將算法轉換爲某些特定於域的代碼,例如用於查詢SQL數據庫的T-SQL查詢語句,用於特定Web服務URI的特定HTTP請求,PowerShell命令,用於雲通知服務的DSQL等。這是Qbservable類型的工廠操作方法的情況。翻譯的特定於域的代碼可以在遠程目標系統中執行,也可以使用表達式表達式進行本地查詢優化。
  就像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 的提供者實現。如果提供程序不實現IQbservable ,標準查詢運算符不能在提供程序的數據源上使用。 IQbservable接口繼承IObservable接口,以便如果它代表一個查詢,則可以訂閱該查詢的結果。訂閱和發佈導致與Qbservable對象相關聯的表達式樹被執行。 “執行表達式樹”的定義是特定於查詢提供者的。例如,它可以涉及將表達式樹翻譯成用於底層數據源的適當查詢語言。 Expression屬性封裝與IQbservable實例相關聯的表達式樹,而Provider封裝與數據源關聯的查詢提供者。
  Qbservable類中聲明的方法集提供了用於查詢實現IQbservable的數據源的標準查詢運算符的實現。標準查詢運算符是遵循LINQ模式的通用方法,使您能夠在任何基於.NET的編程語言中對數據表示遍歷,過濾和投影操作。此類中的大多數方法被定義爲擴展IQbservable類型的擴展方法。這意味着它們可以像實現IQbservable的任何對象上的實例方法一樣被調用。這些擴展IQbservable的方法不會直接執行任何查詢。相反,它們的功能是構建一個Expression對象,它是一個表示累積查詢的表達式樹。然後,這些方法將新的表達式樹傳遞給CreateQuery方法。對目標數據的實際查詢執行由實現IQbservable的類執行。

發佈了125 篇原創文章 · 獲贊 324 · 訪問量 92萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章