Странное поведение в Entity Framework Core с sqlite - PullRequest
2 голосов
/ 01 октября 2019

У меня есть простой DbContext с Set<> пользователями.

У меня есть ASP.NET Core Web API с аутентификацией.

public User Authenticate(string username, string password)
{
    var user = _ctx.Users.FirstOrDefault(x => 
            x.Username.Equals(username, StringComparison.OrdinalIgnoreCase) && 
            x.Password.Equals(password, StringComparison.OrdinalIgnoreCase));

    bool exists = _ctx.Users.Any(x =>
            x.Username.Equals(username, StringComparison.OrdinalIgnoreCase) &&
            x.Password.Equals(password, StringComparison.OrdinalIgnoreCase));

    bool usernameCorrect = _ctx.Users.First().Username.Equals(username, StringComparison.OrdinalIgnoreCase);
    bool passwordCorrect = _ctx.Users.First().Password.Equals(password, StringComparison.OrdinalIgnoreCase);

    if (user == null)
    {
        return null;
    }
    [...]
}

Проблема в том,что _ctx.Users.FirstOrDefault возвращает ноль.

Вы можете подумать, что это просто: "условие не соответствует"

Но:

Что здесь происходит?

1 Ответ

1 голос
/ 01 октября 2019

Происходит то, что сравнение с OrdinalIgnoreCase работает только с материализованным объектом. (Ваш провайдер IQueryable не поддерживает его). Это работает в 3-м и 4-м случаях, потому что вы сначала материализовали объект.

вместо этого попробуйте использовать string.Compare(string str1, string str2, StringComparison.OrdinalIgnoreCase) == 0

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