Исключение при попытке сравнить только дату из даты и времени с ef core 3.0 - PullRequest
0 голосов
/ 11 ноября 2019

После обновления ef core до 3.0, при попытке усечь время и сравнить только дату с datetime, ef core возвращает ошибку:

The LINQ expression 'Where<Category>(\n    source: DbSet<Category>, \n    predicate: (c) => c.CreateAt.Date == DateTime.Now.Date)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

Для этого запроса:

Context.Category.Where(c => c.CreateAt.Date == DateTime.Now.Date).AsNoTracking().ToListAsync();

Мне нужно сравнить только дату, игнорируя время из свойства DateTimeOffSet.

1 Ответ

0 голосов
/ 12 ноября 2019

Кажется, проблема DateTime.Now здесь.

Я не знаю данных, и я не знаю, сохраняете ли вы компонент времени, но есть два варианта, которые вы можете попробовать.

Если вы хотите сравнить две метки времени,возьмите .Now из ламбы и попробуйте следующее.

var today = DateTime.Now.Date; // Or DateTime.Today
Context.Category.Where(c => c.CreateAt.Date == today ).AsNoTracking().ToListAsync();

Если вы хотите получить все записи за сегодня, вы можете попробовать следующее.

var start = DateTime.Today;
var end = Date.Time.Today.AddDays(1); // the following midnight

var todaysCats = Context.Category.Where(c => c.CreateAt >= start && c.CreateAt < end ) // note '>=' and '<'

Кстати. Лучше использовать временные метки Utc для CreatedAt -подобных полей. Это окупается в долгосрочной перспективе.

...