Использование DateTime.Substract в LINQ выбивает ошибку
По задумке из БД должны приходить сотрудники у которых разница между текущей датой и датой старта больше 180 дней. Вот вроде и лямбду написал, но при выполнении выбивает ошибку:
The LINQ expression 'DbSet .Where(e => !(e.IsDeleted) && e.WorkEndDate == null && DateTime.UtcNow.Subtract(e.WorkStartDate).Days > 180)' could not be translated.
Сам код:
var targetEmployees = await _dbContext.Employees
.Where(emp => !emp.IsDeleted && emp.WorkEndDate == null && (DateTime.UtcNow.Subtract(emp.WorkStartDate).Days > 180))
Ответы (3 шт):
Автор решения: Alexandr Kruzer
→ Ссылка
Решил следующим образом:
var targetEmployees = await _dbContext.Employees
.Where(emp => !emp.IsDeleted && emp.WorkEndDate == null)
.AsAnumerable() //создаём локалькую коллекцию, чтобы не нужно было транслировать условие в SQL
.Where(DateTime.UtcNow.Subtract(emp.WorkStartDate).Days > 180));
Автор решения: Alexander Petrov
→ Ссылка
Нужно ввести дополнительную переменную с посчитанным значением и использовать её в запросе.
var dt = DateTime.UtcNow.AddDays(-180);
var targetEmployees = await _dbContext.Employees
.Where(emp => !emp.IsDeleted && emp.WorkEndDate == null && dt > emp.WorkStartDate)
Есть специальные классы с набором функций, которые можно использовать в запросах. DbFunctions в EF Core. SqlFunctions в EF 6.
Автор решения: Alexandr Kruzer
→ Ссылка
Всем спасибо, получилось сделать элегантное решение:
var targetEmployees = _dbContext.Employees
.Where(emp => !emp.IsDeleted && emp.WorkEndDate == null && (EF.Functions.DateDiffDay(DateTime.UtcNow, emp.WorkStartDate) > 180))