update query framework data consulta columns linq entity-framework-4 linq-to-entities

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