Вы сказали, что это работает в dotnet core 2.2
, но не в dotnet core 3.1
. Я предполагаю, что это означает, что вы также используете Entity Framework Core 3
в версии dotnet core 3.1
, и, похоже, это серьезное изменение в Entity Framework Core 3
. См. Здесь .
Старое поведение
До версии 3.0, когда EF Core не мог преобразовать выражение, являющееся частью запроса, в SQL или параметр, он автоматически оценивает выражение на клиенте. По умолчанию оценка клиентом потенциально дорогих выражений только вызвала предупреждение.
Новое поведение
Начиная с 3.0, EF Core допускает только выражения в проекции верхнего уровня (последний вызов Select () в запросе) для оценки на клиенте. Если выражения в любой другой части запроса не могут быть преобразованы либо в SQL, либо в параметр, возникает исключение.
SequenceEqual
нельзя преобразовать в SQL или параметр так что в версии 2.2
это автоматически выполнялось на клиенте. Теперь в версии 3.1
выдается InvalidOperationException
. Использование оператора равенства работает, потому что это можно перевести в оператор SQL.
Чтобы исправить это, почему бы не выбрать Email
, а затем сравнить пароль?
loginCreds.Password = loginCreds.Password.ToLower();
var pass = Helper.ComputeHash(loginCreds.Password);
var usr = await _context.Users
.FirstOrDefaultAsync(u =>u.NormalizedEmail == loginCreds.Email));
bool validUser = false;
if (usr != null)
{
validUser = usr.PasswordHash.SequenceEquals(pass);
}
// if validUser is true, then the credentials were valid.