.NET LINQ do grupy podmiotów według daty (dnia)
Mam tutaj ten sam problem:LINQ to Entities group-by failure przy użyciu .date
Jednak odpowiedź nie jest w 100% poprawna. Działa we wszystkich przypadkach, z wyjątkiem sytuacji, gdy używane są różne strefy czasowe. Gdy używane są różne strefy czasowe, grupuje się także w strefach czasowych. Czemu? Udało mi się to ominąć, używając wielu funkcji encji.
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,
...
});
Czy jest ktoś, kto wie, jak to zrobić we właściwy sposób? Ten kod jest tak brzydki i prawdopodobnie bardzo nieefektywny.
AKTUALIZACJA (ostrzeżenie):
Zdałem sobie również sprawę, że funkcja EntityFunctions.CreateDateTime cierpi na błąd. Nie jest zgodny z latami przestępnymi, takimi jak w tym roku. 29 lutego 2012 rzuci wyjątek.