Ich habe eine Tabelle, die aufzeichnet, was mit einem Fahrzeug während eines Besuchs passiert. Für jeden Besuch gibt es mehrere Zeilen, um anzuzeigen, was getan wurde. Die Tabelle sieht wie folgt ausBerechnung der Differenz zwischen verschiedenen Spalten in verschiedenen Zeilen
VisitID | ActionID | StartTime | EndTime
0 | 0 | 1/1/2013 | 1/2/2013
1 | 0 | 1/2/2013 | 1/4/2013
1 | 1 | 1/4/2013 | 1/7/2013
2 | 0 | 1/4/2013 | 1/5/2013
2 | 1 | 1/5/2013 | 1/6/2013
2 | 2 | 1/6/2013 | 1/7/2013
Ich möchte eine LINQ-Abfrage zu konstruieren, der Lage, immer einen Besuch nahm die Menge an Zeit. TotalTime
wird berechnet, indem zuerst die erste und letzte (niedrigste und höchste) ActionID
, dann last.EndTime - first.StartTime
gefunden wird. Erwartete Ergebnisse:
VisitID | TotalTime
0 | 1
1 | 5
2 | 3
Ich kann meine erwarteten Ergebnisse erzeugen, indem
var first = db.Visits.Where(v => v.ActionID == 0)
var last = db.Visits.GroupBy(x => x.VisitID).Select(g => g.OrderByDescending(x => x.ActionID).First())
first.Join(last, f => f.VisitID, l => l.VisitID, (f, l) new{ VisitID = Key, TotalTime = l.EndTime - f.StartTime});
tun Ich mag es nicht wirklich den Hack, den ich verwendet, um die letzte ActionID zu bekommen, und ich würde wirklich in der Lage sein möchte tue dies innerhalb von 1 LINQ-Anweisung. Was muss ich tun, um dies zu erreichen?
+1 Auch ich denke, er will totaldays, nicht ganze Zeitspanne –
@lazyberezovsky Guter Fang. Ich habe die Antwort aktualisiert, um die Anzahl der Tage zurückzugeben. Ich bin jedoch nicht sicher, ob diese Abfrage mit Entity Framework funktioniert, da dies wie eine EF-Abfrage aussieht. –
Natürlich! Gruppiere nach VisitID und benutze 'min' und' max'. Brownie weist darauf hin, beide Antworten auf eine möglicherweise mehrdeutige Frage zu geben – Jeff