13

我在这里发布了同样的问题: LINQ to Entities group-by failure using .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 函数存在错误。它与闰年不兼容,例如今年。2012 年 2 月 29 日将引发异常。

4

1 回答 1

0

您可以使用 UTC DateTime 并在它之后中继时间。

于 2012-07-12T09:13:05.747 回答