上篇博文介绍了开始StreamInsight查询的一些准备工作。这篇文章将主要介绍如何在LINQPad中输出StreamInsight的查询结果。

生成数据源

首先生成一些随机数据以供后面的查询所用,如下:

var random = new Random();
var baseTime = DateTime.Now.ToLocalTime();

var dataSource = from i in Enumerable.Range(0, 10)
    select new 
    {
        Time = baseTime.AddSeconds(i),
        Value = random.NextDouble()
    };

接下去将dataSource中的数据转换为点类型复杂事件流,调用CepStream.Create,如下:

var inputStream = dataSource.ToPointStream(Application,
        t => PointEvent.CreateInsert(t.Time, t),
        AdvanceTimeSettings.IncreasingStartTime);

对inputStream执行一个简单的过滤操作,找出Value大于0.5的所有点类型事件:

var query = from e in inputStream
            where e.Value > 0.5
            select e;

为了在LINQPad中查看其中的内容,我们只需要简单调用如下语句即可:

query.Dump("SimpleFilter");

上面这句话的意思就是将query的结果输出到LINQPad结果窗口中。(默认情况下,这个输出的过程是推模型的(IObservable),当然也可以主动将其变为拉模型(IEnumerable),后面会谈到。)

输出结果如下:

如果采用拉模型输出结果(本质上是转变为IEnumerable对象),可以使用下述语句:

query.ToEnumerable().Dump("Enumerable");
query.ToPointEnumerable().Dump("Point Enumerable");
query.ToIntervalEnumerable().Dump("Interval Enumerable");
query.ToEdgeEnumerable().Dump("Edge Enumerable");
读者可能会发现,当使用诸如
query.ToPointEnumerable().Dump("Point Enumerable");
时,结果会有显示许多CTI事件。其实,这些CTI事件是那些Value不大于0.5的事件之后的CTI。上述语句运行结果如下:

为了不显示这些CTI事件,我们可以使用下面的语句将其显式的过滤掉:

var eventsWithoutCTI = from e in query.ToPointEnumerable()
                       where e.EventKind != EventKind.Cti
                       select e;

eventsWithoutCTI.Dump("EventsWithoutCTI");

最终的结果如下(考虑到数据是随机生成的,你看到的结果可能和下图并不一致):

下一篇将介绍StreamInsight基础查询中的过滤部分。

作者: StreamInsight 发表于 2011-08-20 19:00 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"