上篇博文介绍了开始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基础查询操作中的过滤部分。