Указанный член типа "Дата" не поддерживается в LINQ to Entities. Только инициализаторы, сущности и свойства навигации сущности
Используя этот код в Entity Framework, я получаю следующую ошибку. Мне нужно получить все строки для определенной даты, DateTimeStart
имеет тип DataType в этом формате 2013-01-30 12:00:00.000
код:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => x.DateTimeStart.Date == currentDateTime.Date);
Ошибка:
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."}
Есть идеи, как это исправить?
Ответы
Ответ 1
DateTime.Date
не может быть преобразован в SQL. Используйте метод EntityFunctions.TruncateTime, чтобы получить дату.
var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
ОБНОВЛЕНИЕ: Поскольку @shankbond упоминается в комментариях, в Entity Framework 6 EntityFunctions
устарев, и вы должны использовать DbFunctions
, который поставляется с Entity Framework.
Ответ 2
Теперь вы должны использовать DbFunctions.TruncateTime
var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
Ответ 3
EntityFunctions
устарел. Вместо этого используйте DbFunctions
.
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
Ответ 4
Я хотел бы добавить решение, которое поможет мне решить эту проблему в инфраструктуре сущности:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => x.DateTimeStart.Year == currentDateTime.Year &&
x.DateTimeStart.Month== currentDateTime.Month &&
x.DateTimeStart.Day == currentDateTime.Day
);
Я надеюсь, что это поможет.
Ответ 5
Всегда используйте EntityFunctions.TruncateTime() для x.DateTimeStart и currentDate.
например:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));
Ответ 6
Просто используйте простые свойства.
var tomorrow = currentDateTime.Date + 1;
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => x.DateTimeStart >= currentDateTime.Date
and x.DateTimeStart < tomorrow);
Если будущие даты в вашем приложении невозможны, достаточно >= x.DateTimeStart >= currentDateTime.Date.
если у вас более сложные сравнения дат, а затем Канонические функции
и если у вас есть функции EF6 + DB
В целом - для людей, ищущих проблемы Поддерживаемые методы Linq в EF
могут объяснить похожие проблемы с операторами linq, которые работают с списками памяти, но не в EF.
Ответ 7
Используйте следующий код для использования EF6:
(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
Ответ 8
Другим решением может быть:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
.Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
Ответ 9
Упрощенная:
DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();