Используя этот код в 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} = {"Указанный член типа 'Date' не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности."}
Есть идеи, как это исправить?
Ответы:
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.TruncateTime
var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
источник
Я хотел бы добавить решение, которое помогло мне решить эту проблему в рамках сущности:
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);
Если будущие даты в вашем приложении невозможны , достаточно > = x.DateTimeStart> = currentDateTime.Date .
если у вас есть более сложные сравнения дат, проверьте канонические функции и если у вас есть функции EF6 + DB
В общем - для людей, ищущих проблемы. Поддерживаемые методы Linq в EF могут объяснить аналогичные проблемы с операторами linq, которые работают со списками базы памяти, но не с EF.
источник
Упрощенный:
DateTime time = System.DateTime.Now; ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
источник
Используйте приведенный ниже код для использования EF6:
(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
источник
Другим решением может быть:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable() .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
источник
У меня такая же проблема с
Entity Framework 6.1.3
Но по другому сценарию. Мое свойство модели имеет тип, допускающий значение NULL
DateTime
DateTime? CreatedDate { get; set; }
Поэтому мне нужно запросить сегодняшнюю дату, чтобы проверить все записи, так что это то, что у меня работает. Это означает, что мне нужно усечь обе записи, чтобы получить правильный запрос
DbContext
:Where(w => DbFunctions.TruncateTime(w.CreatedDate) == DbFunctions.TruncateTime(DateTime.Now);
источник