Los argumentos de DbArithmeticExpression deben tener un tipo común numérico

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(); 

Esta expresión de Linq arroja esta excepción:

 DbArithmeticExpression arguments must have a numeric common type. 

¡Por favor ayuda!

La aritmética con DateTime no es compatible con Entity Framework 6 y versiones anteriores. Tienes que usar DbFunctions *. Entonces, para la primera parte de su statement, algo como:

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

Tenga en cuenta que el método Nullable acepta Nullable .

El núcleo de Entity Framwork (cuando se usa con Sql Server, tal vez otros proveedores de db) admite las funciones de DateTime AddXxx (como AddHours ). Están traducidos a DATEADD en SQL.

* EntityFunctions antes de Entity Framework versión 6.

Sé que esta es una vieja pregunta, pero en su caso específico, en lugar de utilizar DBFunctions como lo sugiere @GertArnold, ¿no podría simplemente invertir la operación de sacar la aritmética en cuestión del Lambda?

Después de todo clientDateTime y time24 son valores de corrección por lo que su diferencia no necesita ser recalculada en cada iteración.

Me gusta:

 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(); 

Este refactor suele ser posible si está intentando comparar la fecha y hora almacenadas modificadas por una marca de tiempo de corrección con otra fecha y hora.

A la inversa, si el rendimiento no es el verdadero objective, puedes intentar usar AsEnumerable() . Entonces, sería como

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

Agregar AsEnumerable () convertirá la consulta SQL en entidad y le permitirá ejecutar funciones .Net en ellas. Para obtener más información, consulte aquí sobre AsEnumerable