Иначе заявление никогда не достигнет

#c# #asp.net #linq

Вопрос:

у меня есть операторы if, которые совпадают с запросом в Linq для создания входа в мое приложение, но код работает плохо, когда запрос не выбирает какую-либо запись .Count() он равен нулю, и в этом есть смысл, но в случае, если код никогда не достигнет другой части, посмотрите, это мой код:

 var UserLogin = from m in _context.User where m.Username.Contains(this.Username) amp; m.Password.Contains(this.Password) select m.Username;
                this.Username = string.Empty;
                this.Password = string.Empty;
                if(UserLogin.Count() != 0)
                {
                    //HttpContext.Session.SetString("Username", UserLogin.First());
                    UsernameLogged = UserLogin.First();
                }
                else
                {
                    Console.WriteLine("Sisa: "   UsernameLogged);
                    this.Username = string.Empty;
                    this.Password = string.Empty;
                    UsernameLogged = string.Empty;
                    Console.WriteLine(UsernameLogged);
                }
 

Комментарии:

1. Не совсем уверен, что вы пытаетесь сделать. Вы получаете ошибку или что? Единственная другая причина, по которой ваша другая часть никогда не будет достигнута, заключается в том, что выполняется блок if. Проверьте значение UserLogin. Подсчет() во время выполнения, и вы можете получить подсказку

2. Вы вручную выровняли код с вашим запросом Linq? Не делай этого, это сбивает с толку.

3. Кстати, ваше сравнение пользователя и пароля имеет ужасные недостатки в системе безопасности.

4. m.Password.Contains(this.Password) — пожалуйста, не сохраняйте пароли в виде обычного текста. вместо этого хэшируйте их.

Ответ №1:

Обратите внимание, что запрос выполняется дважды. В первый раз, когда ты звонишь UserLogin.Count() . Во второй раз, когда ты позвонишь UserLogin.First() . Но тогда у вас уже есть set Username и Password to string.Empty , и все имена пользователей и пароли содержат пустую строку, потому что строка.Содержит только тесты на соответствие части строки. Таким образом, в результате вы получаете всех пользователей. Используйте == для проверки всей строки.

Поскольку вы хотите получить только одного пользователя, используйте FirstOrDefault, который возвращается null , когда пользователь не найден.

 var userLogged = _context.User
    .FirstOrDefault(u => u.Username == Username amp;amp; u.Password == Password);
if (userLogged is null) {
    Console.WriteLine("Sisa: "   UsernameLogged);
    Username = string.Empty;
    Password = string.Empty;
    UsernameLogged = string.Empty;
    Console.WriteLine(UsernameLogged);
} else {
    UsernameLogged = userLogged.Username;
}
 

Вы устанавливаете Username и Password string.Empty дважды. Либо очистите их после «если-еще», если вы всегда этого хотите, либо делайте это только тогда, когда пользователь не найден.

Ответ №2:

Это связано с тем, что вы используете отложенное выполнение запроса LINQ. Ваш запрос выполняется в условии if, и там вы получите счет 1.

Используйте приведенный ниже код —

 var UserLogin = from m in _context.User where m.Username.Contains(this.Username) amp; m.Password.Contains(this.Password) select m.Username;

var count = UserLogin.Count(); // Here your query will be execute

this.Username = string.Empty;
this.Password = string.Empty;

if(count != 0)
{
     //HttpContext.Session.SetString("Username", UserLogin.First());
     UsernameLogged = UserLogin.First();
}
else
{
     Console.WriteLine("Sisa: "   UsernameLogged);
     this.Username = string.Empty;
     this.Password = string.Empty;
     UsernameLogged = string.Empty;
     Console.WriteLine(UsernameLogged);
}
 

Это выполнит ваше условие else.