El miembro de tipo especificado 'Fecha' no es compatible con LINQ to Entities. Solo inicializadores, miembros de la entidad y propiedades de navegación de la entidad.


138

Al usar este código en Entity Framework , recibo el siguiente error. Necesito obtener todas las filas para una fecha específica, DateTimeStartes de tipo DataType en este formato2013-01-30 12:00:00.000

Código:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

Error:

base {System.SystemException} = {"El miembro de tipo especificado 'Fecha' no es compatible en LINQ to Entities. Solo se admiten inicializadores, miembros de entidad y propiedades de navegación de entidad."}

¿Alguna idea para solucionarlo?


Puedo usar x.DateTimeStart.Date en EF Core 2.1.1
Kirsten Greed el

Respuestas:


271

DateTime.Dateno se puede convertir a SQL. Utilice el método EntityFunctions.TruncateTime para obtener la parte de la fecha.

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

ACTUALIZACIÓN: Como @shankbond mencionó en los comentarios, en Entity Framework 6 EntityFunctionsestá obsoleto, y debe usar la DbFunctionsclase, que se envía con Entity Framework.


1
Tengo que modificar ligeramente su versión .Where (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); déjame saber tu tougs
GibboK

1
Espero que no te importe, he editado tu respuesta agregando .date si estás de acuerdo, así que solo como referencia :-) gracias por tu apoyo, realmente lo agradezco
GibboK

1
@GibboK seguro, no hay problema :) Eso fue solo con el propósito de formatear una cadena larga.
Sergey Berezovskiy

68
EntityFunctions es obsoleto, en su lugar use el método
DbFunctions.TruncateTime

1
El miembro de tipo especificado 'Fecha' no es compatible con LINQ to Entities. Solo se admiten inicializadores, miembros de la entidad y propiedades de navegación de la entidad.
SAR

84

Ahora deberías usar DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();


El miembro de tipo especificado 'Fecha' no es compatible con LINQ to Entities. Solo se admiten inicializadores, miembros de la entidad y propiedades de navegación de la entidad.
SAR

17

Me gustaría agregar una solución que me haya ayudado a resolver este problema en el marco de la entidad:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

Espero que ayude.


15

EntityFunctionses obsoleto. Considere usar en su DbFunctionslugar.

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

8

Utilice siempre EntityFunctions.TruncateTime () para x.DateTimeStart y currentDate. como :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));

5

Solo usa propiedades simples.

var tomorrow = currentDateTime.Date + 1;  
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date 
                                   and x.DateTimeStart < tomorrow);

Si las fechas futuras no son posibles en su aplicación, entonces > = x.DateTimeStart> = currentDateTime.Date es suficiente.

si tiene comparaciones de fechas más complejas, verifique las funciones canónicas y si tiene funciones EF6 + DB

Más en general: para las personas que buscan problemas Los métodos de Linq admitidos en EF pueden explicar problemas similares con sentencias de linq que funcionan en Listas de base de memoria pero no en EF.


3

Simplificado:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();

2

Use el siguiente código para usar EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)

0

Otra solución podría ser:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.