EF Linq Ошибка после перехода с dotnet Core 2.2.6 на 3.0.0 - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь обновить решение до нового Core Framework 3.0.0.Теперь у меня небольшая проблема, которую я не понимаю.

Смотри, этот метод был без проблем в 2.2.6:

public async Task<IEnumerable<ApplicationUser>> GetBirthdayUsersCurrentMonth()
    {
        return await ApplicationDbContext.Users
            .Where(x => x.Gender != ApplicationUser.GenderTypes.generic)
            .Where(x => x.BirthDate.GetValueOrDefault().Month == DateTime.Now.Month)
            .Where(x => x.RetireDate == null)
            .OrderBy(x => x.BirthDate.GetValueOrDefault())
            .ToListAsync();
    }

Теперь в 3.0.0 я получаю ошибку Linqговоря это:

InvalidOperationException: выражение LINQ 'Где (источник: где (источник: DbSet, предикат: (a) => (int) a.Gender! = 0), предикат: (a) => a.BirthDate.GetValueOrDefault (). Month == DateTime.Now.Month) 'не удалось перевести.Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsync ()

КогдаЯ отключаю эту строку:

.Where(x => x.BirthDate.GetValueOrDefault().Month == DateTime.Now.Month)

Ошибка исчезла, но, конечно, я получаю всех пользователей.И я не вижу ошибки в этом запросе.Может ли это быть ошибкой в ​​EF Core 3.0.0?

Ответы [ 2 ]

6 голосов
/ 24 сентября 2019

Причина в том, что неявная оценка клиента была отключена в EF Core 3.

Это означает, что ранее ваш код не выполнял условие WHERE на сервере.Вместо этого EF загрузил все строки в память и оценил выражение в памяти.

Чтобы устранить эту проблему после обновления, сначала необходимо выяснить, что именно EF не может преобразовать в SQL.Я думаю, это будет вызов GetValueOrDefault(), поэтому попробуйте переписать его так:

.Where(x => x.BirthDate != null && x.BirthDate.Value.Month == DateTime.Now.Month)
0 голосов
/ 24 сентября 2019

Как писал Даниэль Хилгарт, его решение в порядке и работает.Дополнение Виктора Зихлы, похоже, тоже работает.Я переписал метод следующим образом:

public async Task<IEnumerable<ApplicationUser>> GetBirthdayUsersCurrentMonth()
    {
        return await ApplicationDbContext.Users
            .Where(x => x.Gender != ApplicationUser.GenderTypes.generic)
            //.Where(x => x.BirthDate.GetValueOrDefault().Month == DateTime.Now.Month)
            .Where(x => x.BirthDate.Value.Month == DateTime.Now.Month)
            .Where(x => x.RetireDate == null)
            .OrderBy(x => x.BirthDate)
            .ToListAsync();
    }

Итак, как кажется в Core 3.0.0, не рекомендуется использовать в качестве упомянутого события методы оценки, если это стандартные методы, обслуживаемые самими классами.

Спасибо за вашу помощь.

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