Указанный тип элемента "дата" не поддерживается в 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."}
любые идеи как это исправить?
9 ответов:
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.
теперь вы должны использовать
DbFunctions.TruncateTimevar anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
Я хотел бы добавить решение, которое помогло мне решить эту проблему в entity framework:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference) .Where(x => x.DateTimeStart.Year == currentDateTime.Year && x.DateTimeStart.Month== currentDateTime.Month && x.DateTimeStart.Day == currentDateTime.Day );Я надеюсь, что это помогает.
EntityFunctionsустарела. Рассмотрите возможность использованияDbFunctionsвместо.var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference) .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
всегда используйте EntityFunctions.TruncateTime () для x.DateTimeStart и currentDate. например :
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));
просто используйте простые свойства.
var tomorrow = currentDateTime.Date + 1; var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference) .Where(x => x.DateTimeStart >= currentDateTime.Date and x.DateTimeStart < tomorrow);если будущие даты невозможны в вашем приложении, то >= х.DateTimeStart >= currentDateTime.Дата вполне достаточно.
если у вас есть более сложные сравнения дат, затем проверить канонические функции и если у вас есть EF6+ функции ДБ
в более общем плане - для людей, ищущих проблемы поддерживаемые методы Linq в EF можно объяснить подобные проблемы с linq операторы, которые работают с базовыми списками памяти, но не в EF.
используйте приведенный ниже код для использования EF6:
(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
другое решение может быть:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable() .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
упрощенный:
DateTime time = System.DateTime.Now; ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
Comments