#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.