Не могу использовать .AddDays в запросе EF core 3.1 - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь перенести свой проект из. net core 2.2 в 3.1, следующий код работает нормально, но теперь выдает эту ошибку:

System.InvalidOperationException: выражение LINQ 'DbSet .Where (h => h.DATAI.AddDays ((double) Convert.ToInt32 ((object) h.NRZILE))> = __date_0 && h.DATAI.AddDays ((double) Convert.ToInt32 ((object) h.NRZILE )) <__AddDays_1 || h.DATAI <= __AddDays_1 && h.DATAI.AddDays ((double) Convert.ToInt32 ((object) h.NRZILE))> = __AddDays_1) 'не удалось перевести. Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ().

public async Task<IActionResult> getOp(int day, int month, int year, int daysToShow)
    {
    var date = new DateTime(year, month, day);

    return Ok(await db.HT_REZ
    .Where(r => (r.DATAI.AddDays(Convert.ToInt32(r.NRZILE)) >= date && r.DATAI.AddDays(Convert.ToInt32(r.NRZILE)) < date.AddDays(daysToShow))
     || (r.DATAI <= date.AddDays(daysToShow) &&  r.DATAI.AddDays(Convert.ToInt32(r.NRZILE)) >= date.AddDays(daysToShow))
    )
    .Select(r => new { r.ID,  .... })
    .ToListAsync()
    );
    }

Я обнаружил, что неявная оценка клиента была отключена в EF Core 3, и мне пришлось использовать AsEnumerable перед фильтрацией данных, но я не смог исправить вышеуказанный запрос

спасибо за любую помощь

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Проблема не в вызове DateTime.AddDays, который поддерживается .

Обратите внимание, что в сообщении об исключении показан весь оператор Where, поэтому проблема (не поддерживается) должна быть в другом выражении внутри предиката.

В этом конкретном c случае неподдерживаемым является выражение Convert.ToInt32(r.NRZILE), которое для NRZFILE тип int? соответствует Convert.ToInt32(object).

Хотя EF Core поддерживает подмножество методов класса Convert, в общем случае их следует избегать (кроме преобразований из строки), используя C# операторы приведения или нулевого слияния.

например, замена все вхождения

Convert.ToInt32(r.NRZILE)

с

(int)r.NRZILE

или (в контексте DateAdd)

r.NRZILE ?? 0

и проблема будет решена.

2 голосов
/ 06 февраля 2020

Вам нужно использовать методы расширения DbFunctions и придумать другой подход: вместо этого попробуйте вычислить разницу между датами (метод DateDiffDay). Пожалуйста, смотрите https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbfunctions?view=efcore-3.1.

Кроме того, я не думаю, что вы можете использовать Convert в выражении, поэтому, если значения уже являются числами, просто используйте их как таковые.

...