2016-04-13 12 views
4

Ich habe Objekte, aus denen Messungen in einer einzigen Tabelle gespeichert werden. Ich möchte herausfinden, wie lange ein Objekt innerhalb eines bestimmten Zeitraums in einem bestimmten Zustand war.LINQ Wählen Sie den nächsten Datensatz mit jedem übereinstimmenden Ergebnis

Also zusätzlich zu den Datensatz mit dem gewünschten Zustand muss ich es mit der nächsten Messung aus dem gleichen Objekt paaren, um die Zeit zwischen ihnen zu berechnen.

kam ich mit diesem Monster-up:

// Get the the object entry from Database 
MeasuredObject object1; 
try 
{ 
    object1 = (MeasuredObject)(from getObject in db.MeasuredObject where wantedObject.Id.Equals(getObject.Id) select getObject).Single(); 
} 
catch (System.ArgumentNullException e) 
{ 
    throw new System.ArgumentException("Object does not exist", "wantedObject", e); 
} 

// Get every measurement which matches the state in the time period and the next measurement from it 
var pairs = (from m in object1.Measurements 
      join nextM in object1.Measurements 
      on (from next in object1.Measurements where (m.Id < next.Id) select next.Id).Min() equals nextM.Id 
      where 'm is in time period and has required state' 
      select new { meas = m, next = nextM }); 

Ich würde sagen, dass dies nicht sehr effizient scheint vor allem, wenn ich 3,5 Compact Edition bin mit.

Gibt es eine Möglichkeit, zur nächsten Messung über m zu navigieren oder kann ich irgendwie orderby oder group verwenden, um die nächste ID auszuwählen? Oder machen Sie die Join-Klausel sogar einfacher?

+0

Nur aus Gründen der Übersichtlichkeit ist dies nicht LINQ zu Objekten, noch LINQ zu Entities, aber LINQ zu SQL? Und "Measurements" ist eine Art "IQueryable" und die gesamte LINQ-Abfrage wird als SQL-Abfrage in einer SqlServer-Datenbank ausgeführt. –

+0

Ich bin immer noch ein wenig verwirrt über die verschiedenen Anwendungen um LINQ ... Das Objekt1 wurde aus der Datenbank entnommen. Ich werde den Aufruf von object1 in der Frage hinzufügen. Die Messungen sind jedoch eine SQL-Tabelle, die einen Fremdschlüssel für das Objekt 1 in der Datenbank hat. Also ja ich denke, das ist LINQ zu SQL – Silvyrfir

+0

Ja, ich weiß, es ist verwirrend, aber das ist die Realität. Und verschiedene Quellen erfordern unterschiedliche Lösungen. Das Wichtigste hier ist der ** Typ ** der Eigenschaft "object1.Measurements" - bitte geben Sie es an, z. 'IEnumerable '. 'IQueryeble ' usw. –

Antwort

1

Aus dem veröffentlichten Code sieht es so aus, als würden Sie in der Speichererfassung arbeiten. Wenn das wahr ist, dann sollte die folgende ausreichend sein:

var items = (from m in object1.Measurements 
      where 'm is in time period and has required state' 
      orderby m.Id 
      select m) 
      .ToList(); 

var pairs = items.Select((item, index) => new 
      { 
       meas = item, 
       next = index + 1 < items.Count ? items[index + 1] : null 
      }); 

EDIT: Die oben ist nicht die genaue Äquivalent des Codes, da sie die Filter angewendet wird, bevor die Elemente Paarung. Das genau optimierte Äquivalent wäre wie folgt:

+0

Worauf beziehen sich die Daten [] hier? – Silvyrfir

+0

Tut mir leid, es ist 'items'. Dies geschieht, wenn Sie die Variable außerhalb der VS umbenennen :) –

+0

Okay :) Hatte mich dort sehr verloren. – Silvyrfir

Verwandte Themen