Benutzer mit den meisten Antworten
Linq to Entities, GroupBy()

Frage
-
Hallo Experten,
jetzt bastle ich schon einige Zeit an dieser Abfrage herum und bekomme es einfach nicht hin.
var offenefaelle = context.Buchungs .Where(b => b.AbteilungID == _login.Abteilungsnummer && b.FallID != 0 && b.Fall.FallAbgeschlossen == true) .OrderBy(b => b.FallID)
.ThenBy(b => b.Von)
.GroupBy(b => b.FallID) .Select(b => new { b.Key, Beraternummer = b.Last().Berater.Beraternummer, Beginn = b.Min().Von, Ende = b.Max().Von, Gesamtstunden = b.Sum(bs => ((double)bs.DauerMinuten /60)), Gesamtkosten = b.Sum(bs => (((double)bs.DauerMinuten / 60) * bs.StundensatzIntern))Das Problem sind die Werte Beraternummer, Beginn und Ende. Wenn ich diese 3 Werte herausnehme, funktioniert es.
Ich weiß nicht wie ich das lösen soll. Ich bräuchte aus dem GroupBy(...), welche mir die Termine zu diesem Fall gruppieren soll, das niedrigste und das höchste Datum und die Beraternummer der Buchung mit dem Höchsten Datum. "Von" ist ein DateTime.
Kann mir jemand weiterhelfen? Vielen Dank
Siegfried
Antworten
-
Hallo Elmar!
Vielen Dank für Deine Anregungen. Musste zwischendurch etwas anderes erledigen und habe jetzt einiges probiert. Folgende Abfrage funktioniert:
var offenefaelle = context.Falls .Where(f => f.FallAbgeschlossen == false) .Select(f => new { Fallnummer = f.FallID, BeraterID = f.Buchungs.OrderByDescending(x => x.Von).FirstOrDefault().BeraterID, ErsterTermin = f.Buchungs.Min(x => x.Von), LetzterTermin = f.Buchungs.Max(y => y.Von), Gesamtstunden = f.Buchungs.Sum(bs => ((double)bs.DauerMinuten / 60)), Gesamtkosten = f.Buchungs.Sum(bs => (((double)bs.DauerMinuten / 60) * (double)bs.StundensatzIntern)), }) .Where(f => _login.BeraterID == 0 || _login.BeraterID == f.BeraterID) .OrderBy(f=>f.ErsterTermin) .ToList();
Gruß Siegfried
- Als Antwort markiert Siegfried Reichmann Freitag, 20. Mai 2016 00:06
Alle Antworten
-
Hallo Siegfried,
hättest Du mal die Klasse Buchungs? Damit würde es leichter fallen, das Ganze nachzustellen. Einige typische Testdaten könnten u. U. auch helfen.
Grundsätzliches Problem ist hier dass man in SQL bei einem Group By nur über Aggregate (wie Min/Max) auf Spalten zugreifen kann. Hier wäre es vermutlich sinnvoller entweder ein JOIN einzuschieben, wenn z. B. sicher gestellt ist, dass der Berater immer der gleiche ist - was eine Eindeutigkeit über die FallId bedeuten würde. Im Falle von Beginn/Ende sollte es eine Unterabfrage tun.
Gruß Elmar
-
Hallo Elmar!
Vielen Dank für Deine Anregungen. Musste zwischendurch etwas anderes erledigen und habe jetzt einiges probiert. Folgende Abfrage funktioniert:
var offenefaelle = context.Falls .Where(f => f.FallAbgeschlossen == false) .Select(f => new { Fallnummer = f.FallID, BeraterID = f.Buchungs.OrderByDescending(x => x.Von).FirstOrDefault().BeraterID, ErsterTermin = f.Buchungs.Min(x => x.Von), LetzterTermin = f.Buchungs.Max(y => y.Von), Gesamtstunden = f.Buchungs.Sum(bs => ((double)bs.DauerMinuten / 60)), Gesamtkosten = f.Buchungs.Sum(bs => (((double)bs.DauerMinuten / 60) * (double)bs.StundensatzIntern)), }) .Where(f => _login.BeraterID == 0 || _login.BeraterID == f.BeraterID) .OrderBy(f=>f.ErsterTermin) .ToList();
Gruß Siegfried
- Als Antwort markiert Siegfried Reichmann Freitag, 20. Mai 2016 00:06