2012-06-13 18 views
13

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.

+10

Brzydki kod niekoniecznie jest nieskuteczny. –

+0

tak, ale tak prosta operacja powinna być w stanie pisać w łatwiejszy sposób? – Zeezer

+0

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ą. –

Odpowiedz

0

Możesz użyć czasu UTC DateTime i trunkingu czasu po nim.

+0

Masz na myśli funkcję DateTime ToUniversalTime()? To nie działa w linq do encji. Możesz użyć tylko kilku funkcji i właściwości w linq do encji. – Zeezer

+0

LinqToEntity spróbuj przekonwertować zapytanie do zapytania sql. Nie można przetłumaczyć ToUniversalTime() na Sql. Proponuję najpierw pobrać wszystkie dane (na przykład .ToList()) i wykonać dowolne czynności przy gromadzeniu danych. W przypadku, gdy możesz użyć funkcji ToUTCTime() w zapytaniu Linq. –

+0

Mam do czynienia z ogromnymi tabelami i złożonymi statystykami. Uzyskanie wszystkich danych w pierwszej kolejności będzie miało wpływ na wydajność, której nie chcę podjąć. – Zeezer

Powiązane problemy