13

ここに同じ問題が投稿されています: LINQtoEntitiesグループ化-.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 に答える