Udostępnij za pośrednictwem


Korzystanie z obserwowanych dostawców

Implementując interfejs IQbservable i korzystając z metod rozszerzenia fabryki dostarczonych przez typ Qbservable , można napisać niestandardowego dostawcę LINQ do wykonywania zapytań o dowolny typ danych zewnętrznych, aby te dane były traktowane jako sekwencje, do których można zasubskrybować. Na przykład przykład LINQ to WQL w centrum deweloperów MSDN języka Rx pokazuje, jak utworzyć prostego dostawcę do wykonywania zapytań dotyczących zdarzeń WMI przy użyciu języka WQL. Operatory LINQ fabryki udostępniane przez typ Qbservable umożliwiają abstrakcję sekwencji zdarzeń i zapytań usługi WMI, filtrowania i tworzenia. Subskrybowanie tej sekwencji spowoduje wyzwolenie tłumaczenia wyrażenia zapytania LINQ do języka docelowego, w tym przypadku WQL. 

Używanie interfejsu IQbservable do wykonywania zapytań dotyczących danych zewnętrznych

Gdy wspominamy, że chcemy wysyłać zapytania o dane, najpierw martwimy się o to, co chcemy wykonać zapytanie. Może to być ściągana kolekcja IEnumerable lub asynchroniczna sekwencja asynchroniczna oparta na wypychaniu. Chcemy również wiedzieć, gdzie (w jakim kontekście) chcemy wykonać zapytanie. W przypadku obserwowanych sekwencji obsługiwanych przez interfejs IScheduler i jego różne typy implementacji scheduler. Na koniec chcemy wiedzieć, jak wykonujemy zapytanie. Możemy reprezentować zapytanie (wyrażenie lambda) w dosłownym (skompilowanym w kodzie języka pośredniego .NET (IL), w którym każdy operator w zapytaniu będzie oceniany w sposób liniowy. Jest to przypadek metod operatorów fabrycznych typu Obserwowalnego . Możesz też reprezentować zapytanie przy użyciu drzew wyrażeń, które można przejść w celu uzyskania reprezentowanego algorytmu (np. przewidywania, czy element jest większy niż wartość itp.), a następnie przetłumacz algorytm na kod specyficzny dla domeny, taki jak instrukcja zapytania T-SQL na potrzeby wykonywania zapytań względem bazy danych SQL, określone żądania HTTP dla określonego identyfikatora URI usługi sieci Web, Polecenia programu PowerShell, listy DSQLs dla usług powiadomień w chmurze itp. Jest to przypadek metod operatora fabryki typu Qbservable . Przetłumaczony kod specyficzny dla domeny można wykonać w zdalnym systemie docelowym lub użyć reprezentacji drzewa wyrażeń, aby przeprowadzić optymalizację zapytań lokalnych.

Podobnie jak IObservable/IObserver jest podwójnym elementem IEnumerable/IEnumerable, funkcja IQbservable jest podwójnym elementem IQueryable i zapewnia reprezentację drzewa wyrażeń zapytania IObservable. Można zmienić między typami IQbservable i IObservable przy użyciu metod AsQbservable i AsObservable. Wywołanie asQbservable tworzy drzewo wyrażeń składające się z jednego węzła, który wywołuje oryginalne wystąpienie IObservable . Ta relacja jest ważna w celu zrozumienia, dlaczego należy zdefiniować pełne zapytanie IQbservable rozpoczynające się od sekwencji IQbservable i nie można uzyskać go po prostu przez wywołanie asQbservable dla istniejącego zapytania IQbservable . W poniższym przykładzie wywołanie metody AsQbservable tworzy pełne drzewo zapytań tylko wtedy, gdy kompilujesz zapytanie, stosując element IQbservable AsQbservable do źródła danych.

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

Interfejs IQbservable jest przeznaczony do implementacji przez dostawców zapytań. Ma zostać zaimplementowany tylko przez dostawców, którzy implementują również IQbservable<T>. Jeśli dostawca nie implementuje również protokołu IQbservable<T>, standardowe operatory zapytań nie mogą być używane w źródle danych dostawcy. Interfejs IQbservable dziedziczy interfejs IObservable , aby jeśli reprezentuje zapytanie, wyniki tego zapytania można zasubskrybować. Subskrypcja i publikacja powoduje wykonanie drzewa wyrażeń skojarzonego z obiektem Qbservable . Definicja "wykonywania drzewa wyrażeń" jest specyficzna dla dostawcy zapytań. Może to na przykład obejmować tłumaczenie drzewa wyrażeń na odpowiedni język zapytań dla bazowego źródła danych. Właściwość Expression hermetyzuje drzewo wyrażeń skojarzone z wystąpieniem IQbservable , podczas gdy dostawca hermetyzuje dostawcę zapytań skojarzonego ze źródłem danych.

Zestaw metod zadeklarowanych w klasie Qbservable zapewnia implementację standardowych operatorów zapytań do wykonywania zapytań dotyczących źródeł danych, które implementują funkcję IQbservable. Standardowe operatory zapytań to metody ogólnego przeznaczenia, które są zgodne ze wzorcem LINQ i umożliwiają wyrażanie operacji przechodzenia, filtrowania i projekcji danych w dowolnych elementach . Język programowania oparty na platformie NET. Większość metod w tej klasie jest definiowana jako metody rozszerzenia, które rozszerzają typ IQbservable . Oznacza to, że mogą być one wywoływane jak metoda wystąpienia w dowolnym obiekcie, który implementuje funkcję IQbservable. Te metody rozszerzające funkcję IQbservable nie wykonują żadnych zapytań bezpośrednio. Zamiast tego ich funkcjonalność polega na utworzeniu obiektu Expression, który jest drzewem wyrażeń reprezentującym skumulowane zapytanie. Następnie metody przekazują nowe drzewo wyrażeń do metody CreateQuery. Rzeczywiste wykonywanie zapytań na danych docelowych jest wykonywane przez klasę, która implementuje funkcję IQbservable.

Zobacz też

Odwołanie

IQbservable
Qbservable

Inne zasoby

Centrum deweloperów MSDN Rx