Grupuj według tygodni w LINQ do jednostek

Mam aplikację, która pozwala użytkownikom na wprowadzanie czasu, który spędzają na pracy, i próbuję zbudować dobre raportowanie dla tego, które wykorzystuje LINQ do jednostek. Ponieważ każdyTrackedTime maTargetDate która jest po prostu częścią „Data”DateTime, stosunkowo łatwo jest pogrupować czasy według użytkownika i daty (dla uproszczenia pomijam klauzule „gdzie”):

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

Dzięki doDateTime.Month właściwość, grupowanie według użytkownika i miesiąc jest tylko nieco bardziej skomplikowana:

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

Teraz przychodzi trudna część. Czy istnieje solidny sposób grupowania według tygodnia? Próbowałem na podstawie następującychta odpowiedź do podobnego pytania LINQ do SQL:

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

Ale LINQ to Entities nie wydaje się obsługiwać operacji arytmetycznych na obiektach DateTime, więc nie wie, jak to zrobić(t.TargetDate - firstDay).Days / 7.

Zastanawiałem się nad utworzeniem widoku w bazie danych, który po prostu odwzorowuje dni na tygodnie, a następnie dodaje ten widok do mojego kontekstu Entity Framework i dołączam do niego w moim zapytaniu LINQ, ale wydaje się, że jest to dużo pracy na coś takiego. Czy istnieje dobre rozwiązanie problemu arytmetycznego? Coś, co działa z Linq do Entities, które mogę po prostu włączyć do instrukcji LINQ bez konieczności dotykania bazy danych? Jaki sposób na przekazanie Linq Jednostkom, jak odjąć jedną datę od innej?

streszczenie

Chciałbym podziękować wszystkim za przemyślane i twórcze odpowiedzi. Po tym wszystkim wygląda na to, że prawdziwą odpowiedzią na to pytanie jest „poczekaj aż do .NET 4.0”. Zamierzam przekazać nagrodę Noldorinowi za udzielenie najbardziej praktycznej odpowiedzi, która nadal wykorzystuje LINQ, ze szczególnym uwzględnieniem Jacoba Proffitta za wymyślenie odpowiedzi, która używa Entity Framework bez konieczności modyfikacji po stronie bazy danych. Były też inne świetne odpowiedzi i jeśli spojrzysz na to pytanie po raz pierwszy, zdecydowanie polecam przeczytanie wszystkich tych, które zostały poddane głosowaniu, a także ich komentarzy. To był naprawdę wspaniały przykład mocy StackOverflow. Dziękuję wam wszystkim!

questionAnswers(13)

yourAnswerToTheQuestion