Использование наблюдаемых поставщиков
Реализуя интерфейс IQbservable и используя методы расширения фабрики, предоставляемые типом Qbservable , можно написать пользовательский поставщик LINQ для запроса внешних данных любого типа, чтобы эти данные рассматривались как последовательности, на которые можно подписаться. Например, в примере LINQ to WQL в Rx MSDN Developer Center показано, как создать простой поставщик для запроса событий WMI с помощью WQL. Вы можете использовать заводские операторы LINQ, предоставляемые типом Qbservable , для абстрагирования последовательности событий WMI и запроса, фильтрации и составления их. Подписка на эту последовательность активирует перевод выражения запроса LINQ на целевой язык, в данном случае WQL.
Использование интерфейса IQbservable для запроса внешних данных
Когда мы упоминание, что мы хотим запросить данные, мы сначала заботимся о том, что мы хотим запросить. Это может быть коллекция IEnumerable на основе извлечения или асинхронная наблюдаемая последовательность, основанная на отправке. Мы также хотим знать, где (в каком контексте) нужно выполнить запрос. Для наблюдаемых последовательностей, которые обрабатываются интерфейсом IScheduler и его различными типами реализации планировщика. Наконец, мы хотим узнать, как выполняется запрос. Мы можем представить запрос (лямбда-выражение) дословно (компилируется в код il) .NET), в котором каждый оператор в запросе будет оцениваться линейным образом. Это относится к методам операторов фабрики типа Observable . Или вы можете представить запрос с помощью деревьев выражений, которые можно пройти для получения представленного алгоритма (например, прогнозирования того, больше ли элемент значения и т. д.), а затем преобразовать алгоритм в код, зависящий от предметной области, например инструкцию запроса T-SQL для запроса к базе данных SQL, определенные HTTP-запросы для определенного URI веб-службы. Команды PowerShell, DSQL для облачных служб уведомлений и т. д. Это относится к методам операторов фабрики типа Qbservable . Переведенный код для конкретной области можно выполнить в удаленной целевой системе или использовать представление дерева выражений для оптимизации локальных запросов.
Так же, как IObservable/IObserver является двойником IEnumerable/IEnumerator, IQbservable — это двойник IQueryable и предоставляет представление запроса IObservable в виде дерева выражений. Типы IQbservable и IObservable можно изменить с помощью методов AsQbservable и AsObservable. Вызов AsQbservable создает дерево выражений, состоящее из одного узла, который вызывает исходный экземпляр IObservable . Эта связь важна для понимания того, почему полный запрос IQbservable должен быть определен начиная с последовательности IQbservable и не может быть получен путем простого вызова AsQbservable в существующем запросе IQbservable . В следующем примере вызов 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.