TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);
// first get today's sleeping hours
List<Model.Sleep> sleeps = context.Sleeps.Where(
o => (clientDateTime - o.ClientDateTimeStamp < time24) &&
o.ClientDateTimeStamp.TimeOfDay > time18 &&
clientDateTime.TimeOfDay < time18 &&
o.UserID == userid).ToList();
To wyrażenie Linq zgłasza ten wyjątek:
DbArithmeticExpression arguments must have a numeric common type.
Proszę pomóż!
c#
entity-framework
ado.net
Nawaz Dhandala
źródło
źródło
clientDateTime - o.ClientDateTimeStamp
?Odpowiedzi:
Arytmetyka z
DateTime
nie jest obsługiwana w Entity Framework 6 i starszych. Musisz użyć DbFunctions *. Tak więc w pierwszej części oświadczenia coś takiego:Zauważ, że
DiffHours
metoda akceptujeNullable<DateTime>
.Entity Framwork core (gdy jest używany z serwerem Sql, może inni dostawcy bazy danych ) obsługuje
AddXxx
funkcje DateTime (takie jakAddHours
). Są tłumaczone na językDATEADD
SQL.*
EntityFunctions
przed Entity Framework w wersji 6.źródło
Wiem, że jest to stare pytanie, ale w twoim konkretnym przypadku zamiast używać
DBFunctions
zgodnie z sugestią @GertArnold, czy nie mógłbyś po prostu odwrócić operacji, aby usunąć daną arytmetykę z Lambdy?Po tym wszystkim
clientDateTime
itime24
są wartościami fix więc ich różnica nie musi być przeliczone w każdej iteracji.Lubić:
Ta refaktoryzacja jest zwykle możliwa, jeśli próbujesz porównać przechowywaną datę i godzinę przesuniętą o znacznik czasu poprawki z inną datą i godziną.
źródło
Z drugiej strony, jeśli wydajność nie jest prawdziwym celem, możesz spróbować użyć
AsEnumerable()
. A więc byłoby takDodanie AsEnumerable () spowoduje konwersję zapytania SQL do encji i pozwoli na uruchamianie na nich funkcji .Net. Aby uzyskać więcej informacji, sprawdź tutaj AsEnumerable
źródło