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();
Cette expression Linq lève cette exception:
DbArithmeticExpression arguments must have a numeric common type.
Veuillez aider!
c#
entity-framework
ado.net
Nawaz Dhandala
la source
la source
clientDateTime - o.ClientDateTimeStamp
?Réponses:
L'arithmétique avec
DateTime
n'est pas prise en charge dans Entity Framework 6 et versions antérieures. Vous devez utiliser DbFunctions *. Donc, pour la première partie de votre déclaration, quelque chose comme:Notez que la
DiffHours
méthode accepteNullable<DateTime>
.Entity Framwork core (lorsqu'il est utilisé avec Sql Server, peut-être d'autres fournisseurs de base de données) prend en charge les
AddXxx
fonctions DateTime (commeAddHours
). Ils sont traduits enDATEADD
SQL.*
EntityFunctions
avant Entity Framework version 6.la source
Je sais que c'est une vieille question, mais dans votre cas spécifique, au lieu d'utiliser
DBFunctions
comme suggéré par @GertArnold, ne pourriez-vous pas simplement inverser l'opération pour sortir l'arithmétique en question du Lambda?Après tout,
clientDateTime
ettime24
sont des valeurs fixes, leur différence n'a donc pas besoin d'être recalculée à chaque itération.Comme:
Ce refactor est généralement possible si vous essayez de comparer le datetime stocké décalé par un horodatage fixe avec un autre datetime.
la source
Dans l'autre sens, si la performance n'est pas le véritable objectif, vous pouvez essayer d'utiliser
AsEnumerable()
. Donc, ce serait commeL'ajout de AsEnumerable () convertira la requête SQL en entité et permet d'exécuter des fonctions .Net dessus. Pour plus d'informations, cliquez ici sur AsEnumerable
la source