mam ten sam problem napisali tutaj: LINQ to Entities group-by failure using .dateNET LINQ do grupy podmiotów według daty (dzień)
Jednak odpowiedź nie jest w 100% poprawne. 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ę również w strefach czasowych. Czemu? Udało mi się ominąć to poprzez użycie 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ć w odpowiedni sposób? Ten kod jest tak brzydki i prawdopodobnie bardzo nieefektywny.
AKTUALIZACJA (ostrzeżenie):
Uświadomiłem sobie także, że funkcja EntityFunctions.CreateDateTime cierpi na błąd. Nie jest kompatybilny z latami przestępnymi, jak na przykład w tym roku. 29 lutego 2012 r. Spowoduje wyjątek.
Brzydki kod niekoniecznie jest nieskuteczny. –
tak, ale tak prosta operacja powinna być w stanie pisać w łatwiejszy sposób? – Zeezer
Niekoniecznie. Pamiętaj, że Linq to Entities musi przekonwertować C# na SQL, co oznacza, że ma wiele ograniczeń co do tego, co możesz zrobić, ponieważ nie ma kodu SQL, który obsługuje operację. Funkcja EntityFunctions ma na celu radzenie sobie z tymi ograniczeniami, więc musisz ich używać, jeśli chcesz robić to, co robią. –