Использование Where () вызывает System.ArgumentException в EntityFramework - PullRequest
0 голосов
/ 22 октября 2018

У меня есть простой метод, чтобы получить все недавно измененные объекты из DbSet в EntityFramework:

public List<JobModel> GetJobs()
{
    return db.Jobs
        .Include(j => j.JobStatus)
        .Include(j => j.JobResolution)
        .Include(j => j.Process)
        .Where(j => (DateTime.Now - j.ModifiedDtm).Days < 2)
        .ToList();
}

Это прекрасно работает, без части запроса .Where(...).Но когда я добавляю этот последний бит, я получаю следующие три исключения:

Исключение: «System.ArgumentException» в EntityFramework.dll

Исключение: «System.ArgumentException»в EntityFramework.dll

Возникло исключение: «System.ArgumentException» в EntityFramework.SqlServer.dll

Все строки в db.Jobs имеют действительное значение ModifiedDtm, которое является предшествующимдо DateTime.Now.Что я делаю неправильно?Я попытался переместить метод Where() выше Include(), но безуспешно ...

ОБНОВЛЕНИЕ

Благодаря @CamiloTerevinto я получил немного большеинформативное сообщение об ошибке.Я до сих пор точно не понимаю, что это значит ...

Аргументы DbArithmeticExpression должны иметь общий числовой тип.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я уверен, что вы ищете функцию DbFunctions.DiffDays:

return db.Jobs
    .Include(j => j.JobStatus)
    .Include(j => j.JobResolution)
    .Include(j => j.Process)
    .Where(j => DbFunctions.DiffDays(j.ModifiedDtm, DateTime.Now) < 2)
    .ToList();
0 голосов
/ 22 октября 2018

Вы не можете использовать DateTime.Now в предложении Where в Entity Framework.Это связано с тем, что EF-запросы преобразуются в SQL-запрос, а DateTime.Now не существует в SQL.Вы должны попытаться получить за день до запроса и передать его в виде длинной переменной.

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