Gruppieren nach Wochen in LINQ to Entities

Ich habe eine Anwendung, mit der Benutzer die Zeit eingeben können, die sie für die Arbeit aufgewendet haben, und ich versuche, dafür ein gutes Reporting zu erstellen, das LINQ to Entities nutzt. Weil jederTrackedTime hat einTargetDate Das ist nur der "Date" Teil von aDateTimeEs ist relativ einfach, die Zeiten nach Benutzer und Datum zu gruppieren (der Einfachheit halber lasse ich die "where" -Klauseln weg):

var userTimes = from t in context.TrackedTimes
                group t by new {t.User.UserName, t.TargetDate} into ut
                select new
                {
                    UserName = ut.Key.UserName,
                    TargetDate = ut.Key.TargetDate,
                    Minutes = ut.Sum(t => t.Minutes)
                };

Danke an dieDateTime.Month Eigenschaft, Gruppierung nach Benutzer und Monat ist nur geringfügig komplizierter:

var userTimes = from t in context.TrackedTimes
                group t by new {t.User.UserName, t.TargetDate.Month} into ut
                select new
                {
                    UserName = ut.Key.UserName,
                    MonthNumber = ut.Key.Month,
                    Minutes = ut.Sum(t => t.Minutes)
                };

Jetzt kommt der schwierige Teil. Gibt es eine verlässliche Möglichkeit, nach Woche zu gruppieren? Ich habe folgendes versucht basierend aufdiese Antwort zu einer ähnlichen LINQ to SQL-Frage:

DateTime firstDay = GetFirstDayOfFirstWeekOfYear();
var userTimes = from t in context.TrackedTimes
                group t by new {t.User.UserName, WeekNumber = (t.TargetDate - firstDay).Days / 7} into ut
                select new
                {
                    UserName = ut.Key.UserName,
                    WeekNumber = ut.Key.WeekNumber,
                    Minutes = ut.Sum(t => t.Minutes)
                };

Da LINQ to Entities offenbar keine arithmetischen Operationen für DateTime-Objekte unterstützt, weiß es nicht, wie dies zu tun ist(t.TargetDate - firstDay).Days / 7.

Ich habe überlegt, eine Ansicht in der Datenbank zu erstellen, die einfach Tage bis Wochen abbildet, diese Ansicht dann zu meinem Entity Framework-Kontext hinzufügt und in meiner LINQ-Abfrage dazu beiträgt, aber das scheint eine Menge Arbeit für so etwas zu sein. Gibt es eine gute Lösung für den arithmetischen Ansatz? Etwas, das mit Linq to Entities funktioniert und das ich einfach in die LINQ-Anweisung einbauen kann, ohne die Datenbank berühren zu müssen? Wie kann man Linq to Entities mitteilen, wie ein Datum von einem anderen subtrahiert werden soll?

Zusammenfassung

Ich möchte allen für ihre nachdenklichen und kreativen Antworten danken. Nach all dem Hin und Her sieht es so aus, als ob die eigentliche Antwort auf diese Frage "Warte bis .NET 4.0" ist. Ich werde Noldorin die Bounty für die praktischste Antwort geben, die LINQ noch nutzt, und Jacob Proffitt für eine Antwort, die das Entity Framework verwendet, ohne dass Änderungen auf der Datenbankseite erforderlich sind. Es gab auch noch andere großartige Antworten, und wenn Sie sich die Frage zum ersten Mal ansehen, empfehle ich Ihnen nachdrücklich, alle zur Abstimmung gestellten Fragen sowie deren Kommentare durchzulesen. Dies ist wirklich ein hervorragendes Beispiel für die Leistungsfähigkeit von StackOverflow. Danke euch allen!

Antworten auf die Frage(13)

Ihre Antwort auf die Frage