El miembro de tipo especificado ‘Fecha’ no se admite en LINQ to Entities. Solo inicializadores, miembros de entidad y propiedades de navegación de entidad

Al utilizar este código en Entity Framework , recibo el siguiente error. Necesito obtener todas las filas para una fecha específica, DateTimeStart es del tipo DataType en este formato 2013-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} = {"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."} 

¿Alguna idea para solucionarlo?

DateTime.Date no se puede convertir a SQL. Use 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 se mencionó @shankbond en los comentarios, en Entity Framework 6 EntityFunctions está obsoleto, y debe usar la clase DbFunctions , que se envía con Entity Framework.

Ahora debería usar DbFunctions.TruncateTime

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

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.

EntityFunctions está obsoleto. Considera usar DbFunctions en DbFunctions lugar.

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

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)); 

Simplemente use 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, luego verifique las funciones de Canonical y si tiene funciones EF6 + DB

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

Use el código de abajo para usar EF6:

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

Otra solución podría ser:

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

Simplificado:

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