2016-12-12 1 views
0

Ich habe folgende Linq Funktion:Mongo, verwenden totalmilliseconds in Linq-Abfrage

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 
      }); 

Meine Sammlung sieht wie folgt aus:

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

Was ich versuche zu tun, die Werte über spezifische aggregieren benutzerdefiniertes Zeitintervall Die Werte werden beispielsweise alle zwei Minuten protokolliert, aber ich möchte die Daten als Durchschnitt über 30 Minuten abrufen. Das Problem sieht jedoch so aus, dass der Mongo-Treiber den timespan.TotalMilliseconds-Befehl nicht unterstützt. Ich erhalte die folgende Fehlermeldung beim Versuch, den Code auszuführen:

Eine nicht behandelte Ausnahme des Typs ‚System.NotSupportedException‘ in MongoDB.Driver.dll

Zusätzliche Informationen aufgetreten: Mitglied TotalMilliseconds vom Typ System.TimeSpan in der Ausdrucksbaum ({document} {TimeStamp} - 1/1/2010 12:00:00 AM) .TotalMilliseconds kann nicht übersetzt werden.

Gibt es einen anderen Befehl, den ich versuchen kann, dies zu tun? Oder vielleicht ein ganz anderer Ansatz. Ich würde es vorziehen, die Aggregation in Mongo und nicht lokal auf der Maschine zu machen.

BEARBEITEN Gibt es nicht irgendwie, dass ich den Mongo-Dokument Zeitstempel zu einem anderen Zeitformat konvertieren kann. Ich brauche nur einen konstanten Bezug auf einen Zeitraum.

Antwort

0

Ich denke, das liegt daran, dass es ein TimeSpan-Objekt ist, das Mongo nicht versteht. Versuchen Sie, dies in eine doppelte zuerst zu konvertieren, bevor Sie in Ihrer Abfrage verwenden, und es sollte funktionieren ...

Als eine Randnotiz: Warum sind Ihre Variablen mit 'l' oder 'a' vorangestellt? Ich sehe das manchmal und kann die Argumentation nicht verstehen

+0

Wie konvertiere ich es zu einem Doppel vor der Hand? Ich muss berechnen, was der Zeitstempel dieses bestimmten Dokuments ist. Wird eine Doppelbesetzung dort einfach funktionieren? – blackwolfsa

+0

Auf dem Side Note, die Präfixe bezeichnen, wo die Variable herkommt, l = lokal deklariert, a = Argument. Es ist ein Kodierungsstandard und es macht es leichter, den Code zu lesen und zu lesen. – blackwolfsa