.NET LINQ to实体分组按日期(天)

时间:2012-06-13 14:10:13

标签: c# .net linq group-by timezone

我在这里发布了同样的问题: 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有一个bug。它与闰年不相容,例如今年。 2012年2月29日将抛出异常。

1 个答案:

答案 0 :(得分:0)

您可以使用UTC DateTime并在其后加上时间。