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();
Esta expresión de Linq arroja esta excepción:
DbArithmeticExpression arguments must have a numeric common type.
¡Por favor ayuda!
c#
entity-framework
ado.net
Nawaz Dhandala
fuente
fuente
clientDateTime - o.ClientDateTimeStamp
?Respuestas:
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 declaración, algo como:Tenga en cuenta que el
DiffHours
método aceptaNullable<DateTime>
.Entity Framwork core (cuando se usa con Sql Server, tal vez otros proveedores de base de datos) admite las
AddXxx
funciones DateTime (comoAddHours
). Están traducidos aDATEADD
SQL.*
EntityFunctions
antes de Entity Framework versión 6.fuente
Sé que esta es una pregunta antigua, pero en su caso específico en lugar de usar
DBFunctions
como sugiere @GertArnold, ¿no podría simplemente invertir la operación y sacar la aritmética en cuestión del Lambda?Después de todo,
clientDateTime
ytime24
son valores fijos, por lo que su diferencia no necesita recalcularse en cada iteración.Me gusta:
Esta refactorización suele ser posible si intenta comparar la fecha y hora almacenada desplazada por una marca de tiempo fija con otra fecha y hora.
fuente
Por otro lado, si el rendimiento no es el verdadero objetivo, puede intentar usar
AsEnumerable()
. Entonces, sería comoAgregar AsEnumerable () convertirá la consulta SQL en entidad y permitirá ejecutar funciones .Net en ellos. Para obtener más información, consulte aquí acerca de AsEnumerable
fuente