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();
Dieser Linq-Ausdruck löst diese Ausnahme aus:
DbArithmeticExpression arguments must have a numeric common type.
Bitte helfen Sie!
c#
entity-framework
ado.net
Nawaz Dhandala
quelle
quelle
clientDateTime - o.ClientDateTimeStamp
?Antworten:
Arithmetik mit
DateTime
wird in Entity Framework 6 und früheren Versionen nicht unterstützt. Sie müssen DbFunctions * verwenden. Für den ersten Teil Ihrer Aussage also etwas wie:Beachten Sie, dass die
DiffHours
Methode akzeptiertNullable<DateTime>
.Der Entity Framwork-Kern (bei Verwendung mit SQL Server, möglicherweise anderen Datenbankanbietern) unterstützt die DateTime-
AddXxx
Funktionen (wie zAddHours
. B. ). Sie werdenDATEADD
in SQL übersetzt.*
EntityFunctions
vor Entity Framework Version 6.quelle
Ich weiß, dass dies eine alte Frage ist, aber in Ihrem speziellen Fall, anstatt
DBFunctions
wie von @GertArnold vorgeschlagen zu verwenden, können Sie die Operation nicht einfach umkehren und die betreffende Arithmetik aus dem Lambda entfernen?Immerhin
clientDateTime
undtime24
sind feste Werte, so dass ihre Differenz nicht bei jeder Iteration neu berechnet werden muss.Mögen:
Dieser Refactor ist normalerweise möglich, wenn Sie versuchen, die gespeicherte Datumszeit, die um einen festen Zeitstempel verschoben wurde, mit einer anderen Datumszeit zu vergleichen.
quelle
Wenn die Leistung nicht das eigentliche Ziel ist, können Sie es auch versuchen
AsEnumerable()
. So wäre es wieDurch Hinzufügen von AsEnumerable () wird die SQL-Abfrage in eine Entität konvertiert und es können .NET-Funktionen auf diesen ausgeführt werden. Weitere Informationen zu AsEnumerable finden Sie hier
quelle