Указанный член типа Date не поддерживается в LINQ to Entities. Только инициализаторы, члены сущности и свойства навигации сущности


141

Используя этот код в 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. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности."}

Есть идеи, как это исправить?


Я могу использовать x.DateTimeStart.Date в EF Core 2.1.1
Кирстен

Ответы:


275

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.


1
Мне нужно немного изменить вашу версию .Where (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); дайте мне знать ваши мысли
GibboK

1
Надеюсь, вы не против, я отредактировал ваш ответ, добавив .date, если вы согласны, так что просто для справки :-) Спасибо за вашу поддержку, я очень ценю это
GibboK

1
@GibboK конечно, без проблем :) Это было просто для форматирования длинной строки.
Сергей Березовский

69
EntityFunctions устарело, вместо этого используйте метод
DbFunctions.TruncateTime

1
Указанный член типа Date не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности.
SAR

84

Теперь вы должны использовать DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();


Указанный член типа Date не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности.
SAR

18

Я хотел бы добавить решение, которое помогло мне решить эту проблему в рамках сущности:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

Я надеюсь, что это поможет.


15

EntityFunctionsустарело. Рассмотрите возможность использования DbFunctionsвместо этого.

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

8

Всегда используйте EntityFunctions.TruncateTime () как для x.DateTimeStart, так и для currentDate. такие как :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));

5

Просто используйте простые свойства.

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.


3

Упрощенный:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();


0

Другим решением может быть:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();

0

У меня такая же проблема с Entity Framework 6.1.3

Но по другому сценарию. Мое свойство модели имеет тип, допускающий значение NULLDateTime

DateTime? CreatedDate { get; set; }

Поэтому мне нужно запросить сегодняшнюю дату, чтобы проверить все записи, так что это то, что у меня работает. Это означает, что мне нужно усечь обе записи, чтобы получить правильный запрос DbContext:

Where(w => DbFunctions.TruncateTime(w.CreatedDate) == DbFunctions.TruncateTime(DateTime.Now);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.