使用可观察的提供者

  通过实现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的类执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值