基于持有周期的StreamInsight查询
本文关键字:StreamInsight 查询 周期 于持 | 更新日期: 2023-09-27 18:17:45
我有一个事件流,其中包含一些变量的值。这些值每秒都在变化。每个变量都有定义的上限、下限和阈值周期。
例如,Variable1的上限= 95,下限= 5,阈值= 5秒。
因此,如果Variable1的值在阈值周期(5秒)内保持在95(高限制)以上,那么我们应该创建一个输出事件。
我能够创建查询来检查单个事件(如果它们超过了限制),但是我不确定如何创建一个窗口查询来检查阈值期间是否违反了限制。
谢谢,
不完全是Linq查询,但应该可以达到目的:
public IEnumerable<IEnumerable<int>> GetWindows(IEnumerable<int> events)
{
while (events.Any())
{
events = events.SkipWhile(x => x > 5 && x < 95);
if (events.Any())
{
var isLow = events.First() <= 5;
var res = events.TakeWhile(x => isLow ? x <= 5 : x >= 95).ToList();
if (res.Count >= 5)
yield return res;
events = events.Skip(res.Count);
}
}
}
基本上:
- 跳过所有无趣的事件
- 如果条目数超过阈值,则占用窗口并放弃
- 通过跳过 窗口来推进枚举
你可以这样使用:
foreach (var window in GetWindows(events))
{
... raise event
}
注意:如果你的事件作为一个潜在的无限流进入,你的事件窗口可能会变得非常大,那么你将不会得到窗口返回,直到它被完全消耗,这可能需要一些时间和内存。您可以在看到5个元素后打破TakeWhile
部分,然后在那里屈服,然后简单地跳过窗口的其余部分。这取决于你具体想做什么