2012-03-22 9 views
91
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 LINQ lanza esta excepción:argumentos DbArithmeticExpression deben tener un tipo común numérica

DbArithmeticExpression arguments must have a numeric common type. 

Por favor, ayuda!

+0

¿Cuál es el resultado de 'clientDateTime - o.ClientDateTimeStamp'? – shahkalpesh

+0

noramlly que debería ser un objeto del TimeSpan, en FE se lanza una excepción. –

Respuesta

189

La aritmética con DateTime no es compatible con Entity Framework 6 y anteriores. Tienes que usar DbFunctions *. Así, para la primera parte de su declaración, algo así como:

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

Tenga en cuenta que el método DiffHours acepta Nullable<DateTime>.

Entidad Framwork núcleo (cuando se utiliza con SQL Server, tal vez otros proveedores db) apoya el DateTime AddXxx funciones (como AddHours). Están traducidos a DATEADD en SQL.

* EntityFunctions antes de la versión de Entity Framework 6.

1

Sé que esto es una cuestión de edad, pero en su caso específico en lugar de utilizar DBFunctions según lo sugerido por @GertArnold, ¿no podría simplemente invertir la operación mover la aritmética en cuestión desde el Lambda?

Después de todo, clientDateTime y time24 son valores de corrección por lo que no es necesario recalcular su diferencia en cada iteración.

igual:

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<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientdtminus24 < o.ClientDateTimeStamp) && 
      o.ClientDateTimeStamp.TimeOfDay > time18 && 
      clientDateTime.TimeOfDay < time18 && 
      o.UserID == userid).ToList(); 

Este perfeccionar por lo general es posible si usted está tratando de comparar la fecha y hora almacenada desplazado por una marca de tiempo fijo con otro de fecha y hora.

Cuestiones relacionadas