linq - query - sql command entity framework
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 (9)
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?
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.
Otra solución podría ser:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
.Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
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 DbFunctions EF6 + DbFunctions
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)
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));
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.
EntityFunctions
está obsoleto. Considera usar DbFunctions
en DbFunctions
lugar.
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
Simplificado:
DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();