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?

GibboK
fuente
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.

Sergey Berezovskiy
fuente
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();
WaZ
fuente
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.

jvrdelafuente
fuente
15

EntityFunctionses obsoleto. Considere usar en su DbFunctionslugar.

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
Leonel Sanches da Silva
fuente
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));
Babul Mirdha
fuente
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.

phil soady
fuente
3

Simplificado:

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

Use el siguiente código para usar EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
Abdus Salam Azad
fuente
0

Otra solución podría ser:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
cozmin-calin
fuente