Подтвердить что ты не робот

.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 года выйдет исключение.

4b9b3361

Ответ 1

Вы можете использовать UTC DateTime и трансконтировать время после него.