ここに同じ問題が投稿されています: 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日は例外をスローします。