.NET LINQ для группировки сущностей по дате (дню)

У меня такая же проблема размещена здесь: Ошибка группировки LINQ to Entities с использованием .date

Однако ответ не является на 100 % правильным. Это работает во всех случаях, кроме случаев, когда используются разные часовые пояса. Когда используются разные часовые пояса, он также группируется по часовым поясам. Почему? Мне удалось обойти это, используя множество функций сущности.

int localOffset= Convert.ToInt32(
    TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes);

var results = (
    from perfEntry in db.entry
    where (....)
    select new { 
        perfEntry.Operation, perfEntry.Duration, 
        localTime = EntityFunctions.AddMinutes(perfEntry.Start, 
            localOffset - EntityFunctions.GetTotalOffsetMinutes(
                perfEntry.Start)) 
    }
).GroupBy(x => new { 
    Time = EntityFunctions.TruncateTime(
        EntityFunctions.CreateDateTime(x.localTime.Value.Year,
            x.localTime.Value.Month, x.localTime.Value.Day, 0, 0, 0)),
    x.Operation }
).OrderByDescending(a => a.Key).
Select(g => new {
    Time = g.Key.Time,
    ...
});

Есть ли кто-нибудь, кто знает, как это сделать правильно? Этот код такой уродливый и, вероятно, очень неэффективный.

ОБНОВЛЕНИЕ (предупреждение):
Я также понял, что функция EntityFunctions.CreateDateTime страдает от ошибки. Это не совместимо с високосными годами, такими как этот год. 29 февраля 2012 года произойдет исключение.

13
задан Community 23 May 2017 в 10:10
поделиться