2011-12-12 60 views
0

我有一個事件流,其中包含一些變量的值。這些值每秒都在變化。每個變量具有高限制,低限制和定義的閾值時間段。基於持有期的StreamInsight查詢

例如,假設變量1的上限= 95,下限= 5,閾值= 5秒。

因此,如果Variable1的值在閾值週期(5秒)內保持在95(上限)以上,那麼我們應該創建一個輸出事件。

我能夠創建查詢來檢查單個事件(如果他們已超過限制),但我不確定如何創建窗口查詢來檢查閾值期限是否被違反。

感謝,

回答

1

嗯,不是完全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); 
     } 
    } 
} 

基本上是:

  • 跳過所有不受關注的事件
  • 採取窗口如果超過閾值期限,則產生更多條目
  • 推進en umeration通過跳過窗口

的,你可以使用它像這樣:

foreach (var window in GetWindows(events)) 
{ 
    ... raise event 
} 

注意:如果您的活動來作爲一個潛在的無限流以及活動窗口就變得非常大,那麼你贏了」讓窗口返回,直到完全消耗,這可能需要一些時間和內存。看到5個元素後,你可以打破TakeWhile部分,然後屈服,然後簡單地跳過窗口的其餘部分。這取決於你想要做什麼。

+0

謝謝,我終於創建了一個跳躍窗口,然後通過事件(窗口)中定義一個用戶定義的聚集,循環和檢查超出閾值的事件。 –