Группировка по неделям в LINQ to Entities

У меня есть приложение, которое позволяет пользователям вводить время, которое они проводят за работой, и я пытаюсь создать для этого хорошую отчетность, которая использует LINQ to Entities. Потому что каждыйTrackedTime имеетTargetDate которая является просто «датой» частьDateTimeотносительно просто сгруппировать время по пользователю и дате (я опускаю предложения "где" для простоты):

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

БлагодаряDateTime.Month Свойство, группировка по пользователю и месяцу лишь немного сложнее:

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

Теперь самое сложное. Есть ли надежный способ группировки по неделям? Я попробовал следующее на основеэтот ответ на аналогичный вопрос LINQ to 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)
                };

Но LINQ to Entities, по-видимому, не поддерживает арифметические операции над объектами DateTime, поэтому он не знает, как это сделать.(t.TargetDate - firstDay).Days / 7.

Я рассмотрел создание представления в базе данных, которое просто отображает дни в недели, а затем добавляет это представление в мой контекст Entity Framework и присоединяется к нему в моем запросе LINQ, но для такой работы кажется, что это большая работа. Есть ли хороший обходной путь для арифметического подхода? Что-то, что работает с Linq to Entities, что я могу просто включить в оператор LINQ, не касаясь базы данных? Какой-нибудь способ рассказать Linq Entities, как вычесть одну дату из другой?

Summary

Я хотел бы поблагодарить всех за их вдумчивые и творческие ответы. После всего этого взад и вперед кажется, что реальный ответ на этот вопрос - «подождать до .NET 4.0». Я собираюсь отдать награду Нолдорину за то, что он дал самый практичный ответ, который все еще использует LINQ, со специальным упоминанием Якоба Проффитта за то, что он придумал ответ, который использует Entity Framework без необходимости изменений на стороне базы данных. Были и другие отличные ответы, и если вы рассматриваете вопрос впервые, я настоятельно рекомендую прочитать все те, за которые проголосовали, а также их комментарии. Это действительно был превосходный пример силы StackOverflow. Спасибо вам всем!

Ответы на вопрос(13)

Ваш ответ на вопрос