Вказаний член типу "Дата" не підтримується в LINQ для Суб'єктів. Лише ініціалізатори, члени сутності та властивості навігації об'єктів


138

Використовуючи цей код в 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} = {"Вказаний член типу" Дата "не підтримується в LINQ для сутностей. Підтримуються лише ініціалізатори, члени об'єкта та властивості навігації сутності."}

Будь-які ідеї, як це виправити?


Я можу використовувати x.DateTimeStart.Date в EF Core 2.1.1
Кірстен Жадібність

Відповіді:


271

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
Я повинен трохи змінити вашу версію. Де (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); дай мені знати твоїм думкам
GibboK

1
Сподіваюсь, ви не заперечуєте, що я відредагувавши вашу відповідь, додавши .дайте, якщо ви згодні, тому просто для довідки :-) дякую за вашу підтримку, я дуже ціную це
GibboK

1
@GibboK впевнено, немає проблем :) Це було лише з метою форматування довгих рядків.
Сергій Березовський

68
EntityFunctions є застарілим, замість цього використовуйте метод
DbFunctions.TruncateTime

1
Вказаний член типу "Дата" не підтримується в LINQ для Суб'єктів. Підтримуються лише ініціалізатори, члени об'єкта та навігаційні властивості сутності.
SAR

83

Тепер ви повинні використовувати DbFunctions.TruncateTime

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


Вказаний член типу "Дата" не підтримується в LINQ для Суб'єктів. Підтримуються лише ініціалізатори, члени об'єкта та навігаційні властивості сутності.
SAR

17

Я хотів би додати рішення, яке допоможе мені вирішити цю проблему в рамках сутності:

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 достатньо.

якщо у вас є більш складні порівняння дати, перевірте Canonical функції та чи є у вас функції 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.