2016-12-12 5 views
0

У меня есть следующие функции Linq:Монго, используйте TotalMilliseconds в Linq запрос

TimeSpan lInterval = aEndTime - aBeginTime; 
int lIntervalInt = (int)Math.Round(lInterval.TotalMilliseconds/(30*60*1000)); 

var meh = lCollection.Aggregate() 
      .Match(lValue => lValue.Tag == LTag._id) 
      .Match(lValue => lValue.TimeStamp >= aBeginTime) 
      .Match(lValue => lValue.TimeStamp <= aEndTime) 
      .Group(lValue => new {Period = (lValue.TimeStamp-aBeginTime).TotalMilliseconds/lIntervalInt, TimeStamp = lValue.TimeStamp }, g => 
       new 
       { 
        Key = g.Key, 
        avgValue = g.Average(x => x.Value) 
       }) 
      .Project(r => new cValueDouble() 
      { 
       TimeStamp = r.Key.TimeStamp, 
       Tag = LTag._id, 
       Value = r.avgValue 
      }); 

Моя коллекция выглядит следующим образом:

ObjectId _id; 
DateTime TimeStamp; 
ObjectId Tag; 
double Value; 

То, что я пытаюсь сделать, это агрегировать значения через специфические пользовательский временной интервал. Значения, например, регистрируются каждые две минуты, но я хочу получить данные в среднем за 30 минут. Но проблема в том, что драйвер mongo не поддерживает команду timespan.TotalMilliseconds. Я получаю следующее сообщение об ошибке при попытке запустить код:

Необработанное исключение типа «System.NotSupportedException» произошло в MongoDB.Driver.dll

Дополнительная информация: TotalMilliseconds Член типа System.TimeSpan в дерево выражений ({document} {TimeStamp} - 1/1/2010 12:00:00 AM) .TolalMilliseconds не может быть переведено.

Есть ли другая команда, которую я могу попытаться сделать? Или, возможно, совершенно другой подход. Я бы предпочел сделать агрегацию в монго, а не локально на машине.

EDIT Не могу ли я каким-либо образом преобразовать временную метку документа mongo в какой-то временный формат. Мне нужно иметь постоянную ссылку на период времени.

ответ

0

Я думаю, это потому, что это объект типа TimeSpan, который Mongo не понимает. Попробуйте преобразовать это в двойное первое, прежде чем использовать в своем запросе, и он должен работать ...

В качестве примечания стороны: Почему ваши переменные имеют префикс «l» или «a»? Я вижу это иногда и не могу понять аргументацию

+0

Как преобразовать его в двойную перед рукой? Мне нужно рассчитать, что такое временная метка конкретного документа. Будет ли бросок, чтобы удвоить, просто работать там? – blackwolfsa

+0

На стороне, префиксы обозначают, откуда происходит переменная, l = объявлено локально, a = аргумент. Его стандарт кодирования, и он упрощает кодирование, а также считывает код. – blackwolfsa

 Смежные вопросы

  • Нет связанных вопросов^_^