Les arguments DbArithmeticExpression doivent avoir un type commun numérique

TimeSpan time24 = new TimeSpan(24, 0, 0); TimeSpan time18 = new TimeSpan(18, 0, 0); // first get today's sleeping hours List sleeps = context.Sleeps.Where( o => (clientDateTime - o.ClientDateTimeStamp  time18 && clientDateTime.TimeOfDay < time18 && o.UserID == userid).ToList(); 

Cette expression Linq renvoie cette exception:

 DbArithmeticExpression arguments must have a numeric common type. 

S’il vous plaît aider!

L’arithmétique avec DateTime n’est pas prise en charge dans Entity Framework 6 et les versions antérieures. Vous devez utiliser DbFunctions *. Donc, pour la première partie de votre déclaration, quelque chose comme:

 var sleeps = context.Sleeps(o => DbFunctions.DiffHours(o.ClientDateTimeStamp, clientDateTime) < 24); 

Notez que la méthode Nullable accepte Nullable .

Le kernel Entity Framwork (utilisé avec Sql Server, peut-être d'autres fournisseurs de firebase database) prend en charge les fonctions DateTime AddXxx (comme AddHours ). Ils sont traduits en DATEADD en SQL.

* EntityFunctions avant Entity Framework version 6.

Je sais que c’est une vieille question, mais dans votre cas particulier, au lieu d’utiliser DBFunctions comme suggéré par @GertArnold, ne pourriez-vous pas simplement inverser l’opération en déplaçant l’arithmétique en question de Lambda?

Après tout, clientDateTime et time24 sont des valeurs time24 , leur différence n’a donc pas besoin d’être recalculée à chaque itération.

Comme:

 TimeSpan time24 = new TimeSpan(24, 0, 0); TimeSpan time18 = new TimeSpan(18, 0, 0); var clientdtminus24 = clientDateTime - time24; // first get today's sleeping hours List sleeps = context.Sleeps.Where( o => (clientdtminus24 < o.ClientDateTimeStamp) && o.ClientDateTimeStamp.TimeOfDay > time18 && clientDateTime.TimeOfDay < time18 && o.UserID == userid).ToList(); 

Ce refactor est généralement possible si vous essayez de comparer le datetime stocké décalé par un horodatage de correctif avec un autre datetime.

Dans l’autre sens, si la performance n’est pas le véritable objective, vous pouvez essayer d’utiliser AsEnumerable() . Donc, ce serait comme

 List sleeps = context.Sleeps.AsEnumerable().Where(.... 

L’ajout de AsEnumerable () convertira la requête SQL en entité et permettra d’exécuter les fonctions .Net sur celles-ci. Pour plus d’informations, consultez ici AsEnumerable