2012-08-16 39 views
5

I 'usando EF 4, tengo una propiedad DateTimeStart en mis entidades con datein este formato 16/08/2012 08:14:40, me gustaría consultar con EF y encontrar todas las entidades within the date 16/08/2012 only. El uso de este código de abajo Código de Recibo este errorEF cómo filtrar los datos por fecha

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 

mi código

DateTime dateTimeNow = DateTime.UtcNow; 
     DateTime dateNow = dateTimeNow.Date; 
     return db.EventCustoms.Where(x => x.DataTimeStart.Date <= dateNow) 
      .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart }); 
+0

Qué tipo de datos es la DataTimeStart? – podiluska

+0

System.DateTime – GibboK

Respuesta

5
DateTime dateTimeNow = DateTime.UtcNow; 
DateTime dateTomorrow = dateTimeNow.Date.AddDays(1); 
return db.EventCustoms.Where(x => x.DataTimeStart < dateTomorrow) 
      .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart }); 

[Editar] @GibboK, Para elaborar un poco:

Marco de la entidad no se puede traducir la propiedad Date en su objeto DateTime en la base de datos lado.

Las opciones son:

(1) (como arriba) reconsiderar su consulta y tratar de una solución que no requiere una llamada función de la parte de base de datos para cada fila de la tabla .... el cual es bueno para el rendimiento de las consultas también

(2) o si eso no es posible, se puede hacer uso de la clase EntityFunctions, que expone los métodos (tales como TruncateTime) que puede traducirse por EF en el nativo apropiado función para la fuente de datos subyacente.

p. Ej.

return db.EventCustoms 
    .Where(x => EntityFunctions.TruncateTime(x.DataTimeStart) <= dateNow) 
+0

¡funciona muchas gracias! – GibboK

+1

Al implementar esta respuesta hoy, descubrí que 'System.Data.Entity.Core.Objects.EntityFunctions' está en desuso y debería reemplazarse por' System.Data.Entity.DbFunctions'. El mismo método TruncateTime() existe en el nuevo espacio de nombres/clase, por lo que simplemente cambiar 'EntityFunctions' a' DbFunctions' y agregar la declaración de uso correcta debería funcionar bien para los futuros usuarios de esta respuesta. – andrewcbancroft

+0

Pero tenga en cuenta, en qué declaración de SQL esto se traducirá. Es algo así como '((convert (datetime2, convert (varchar (255), [Filter1]. [DateTimeStart], 102), 102)) <= '2017-01-13 00: 00: 00''- así que Creo que iré con la versión 'dateTomorrow', ya que esto no necesitará ninguna conversión en el DB en el nivel de la fila. – Gerwald

3
DateTime dateTimeNow = DateTime.UtcNow; 
     DateTime dateNow = dateTimeNow.Date; 
     return db.EventCustoms.Where(
      x => EntityFunctions.DiffDays(x.DataTimeStart, dateNow) >= 0) 
      .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart }); 
+0

hola Amiram Korach, desafortunadamente no funciona, ¿podría echar un vistazo y avisarme? muchas gracias por su tiempo – GibboK

+0

Disculpe mi error. Debe ser "> =". Este método te dará un número positivo si el primer valor es más pequeño que el segundo. –

0

En EF 6:

using System.Data.Entity; 
... 
db.EventCustoms.Where(x => 
DbFunctions.TruncateTime(x.DataTimeStart) <= DbFunctions.TruncateTime(dateNow)) 
Cuestiones relacionadas