LINQ на Identity не работает после обновления до 3.0? - PullRequest
0 голосов
/ 30 октября 2019

Я обновил веб-приложение asp.netcore 2.x до версии 3.0, и у меня очень странное поведение с запросом LINQ для пользователей Identity: если я запускаю запрос Linq, чтобы получить пользователя Identity на основе имени пользователя, результатимеет значение null, но если я зацикливаю пользователей и применяю условие вручную, оно работает.

Приложение настроено с учетными записями «отдельных пользователей»

Я пробовал некоторые варианты запроса Linq, ноони все возвращают ноль. Если я проверю представление результатов «_Context.Users» в visualstudio, пользователи там находятся.

Рассмотрим следующий код, где _Context - это мой ApplicationDBContext, а name - это имя пользователя, которого я хочу получить. (и да, строка является правильным именем пользователя)

 var user = _Context.Users.Where(u => u.UserName.Equals(name)).FirstOrDefault();
//var u2 = (from u in _Context.Users where u.UserName.Equals(name) select u).FirstOrDefault();
//var u3 =  _Context.Users.FirstOrDefault(u => u.UserName.Equals(name);

//at this point user should not be null, but it is
if (user == null)
{
    var users = _Context.Users;
    foreach (var u in users)
    {
        if (u.UserName.Equals(name))
        {
            //if the linq does not work, we should not get here but we do
            user = u;
            break;
        }
    }
}

Я думаю, что результат запросов и цикла должен быть одинаковым, но это не так. Использование цикла - это обходной путь, но я подозреваю, что он гораздо менее эффективен, чем запрос к базе данных. Я также не уверен в развертывании моего приложения в Azure с такими странными вещами (причина, по которой я обновился, заключается в том, что развертывание в Azure не удалось из-за некоторых конфликтов).

Я не на 100%уверен, что это связано с 3.0, но запрос работал до обновления. Кажется, сама аутентификация работает правильно, я могу войти с любым пользователем.

1 Ответ

0 голосов
/ 05 ноября 2019

Оказывается, что причиной проблемы стал параметр 'StringComparison.CurrentCultureIgnoreCase', который был пропущен в примере кода (чтобы сделать его более читабельным). С этим параметром сгенерированный запрос был

SELECT TOP(1) [a].[Id], [a].[Email], ...., [a].[UserName]  FROM [AspNetUsers] AS [a]  WHERE CAST(0 AS bit) = CAST(1 AS bit)

Очевидно, что этот запрос никогда не будет иметь никаких результатов.

Если регистр важен, он работает, изменяя linq где на u.UserName.ToLower() == name.ToLower(), но как SQLрегистр не учитывается по умолчанию, просто с помощью name.Equals(u.UserName) также работает.

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