Запрос StreamInsight на основе периода ожидания - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть поток событий, который содержит значения для некоторых переменных. Значения меняются каждую секунду. Каждая переменная имеет верхний предел, нижний предел и пороговый период.

Например, скажем, переменная1 имеет верхний предел = 95, нижний предел = 5 и порог = 5 секунд.

Таким образом, если значения Variable1 остаются выше 95 (верхний предел) для порогового периода (5 секунд), то мы должны создать выходное событие.

Я могу создать запрос для проверки отдельных событий (если они превысили пределы), но я не уверен, как создать оконный запрос, чтобы проверить, были ли ограничения нарушены для порогового периода.

Спасибо

1 Ответ

1 голос
/ 12 декабря 2011

Ну, не совсем 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
}

Примечание. Если ваши события представляют собой потенциально бесконечный поток и окна событий могут стать очень большими, вы не получите окно, возвращаемое до тех пор, пока оно не будет полностью использовано, что может занять некоторое время и память. Вы можете разбить часть TakeWhile, увидев 5 элементов, а затем сдаться и просто пропустить оставшуюся часть окна. Это зависит от того, что именно вы хотите сделать.

...