使用可观测提供程序

通过实现 IQbservable 接口并使用 Qbservable 类型提供的工厂扩展方法,可以编写自定义 LINQ 提供程序来查询任何类型的外部数据,以便这些数据被视为可以订阅的序列。 例如,Rx MSDN 开发人员中心中的 LINQ to WQL 示例演示如何生成一个简单的提供程序,以便使用 WQL 查询 WMI 事件。 可以使用 Qbservable 类型提供的工厂 LINQ 运算符来抽象一系列 WMI 事件,并对其进行查询、筛选和撰写。 订阅此序列将触发 LINQ 查询表达式转换为目标语言(在本例中为 WQL)。 

使用 IQbservable 接口查询外部数据

当我们提及要查询数据时,我们首先关心的是要查询的内容。 这可以是基于拉取的 IEnumerable 集合,也可以是基于推送的异步 Observable 序列。 我们还想知道 (在哪个上下文) 执行查询。 对于 可观测 序列,由 IScheduler 接口及其各种计划程序实现类型处理。 最后,我们想知道如何执行查询。 我们可以 (lambda 表达式) (逐字表示查询, (编译为 .NET 中间语言 (IL) 代码) ,其中将线性计算查询中的每个运算符。 可 观测 类型的工厂运算符方法就是这种情况。 或者,可以使用表达式树来表示查询,这些表达式树可以遍历以获取表示的算法 (例如,预测项是否大于值等) ,然后将该算法转换为某些特定于域的代码,例如用于查询 SQL 数据库的 T-SQL 查询语句、针对特定 Web 服务 URI 的特定 HTTP 请求, PowerShell 命令、云通知服务的 DSQL 等。 Qbservable 类型的工厂运算符方法就是这种情况。 转换后的域特定代码可以在远程目标系统中执行,也可以使用表达式树表示形式执行本地查询优化。

就像 IObservable/IObserver 是 IEnumerable/IEnumerator 的双元一样, IQbservableIQueryable 的双元,并提供 IObservable 查询的表达式树表示形式。 可以使用 AsQbservableAsObservable 方法在 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 的类执行。

另请参阅

参考

IQbservable
Qbservable

其他资源

Rx MSDN 开发人员中心