否则声明永远不会到达
Posted
技术标签:
【中文标题】否则声明永远不会到达【英文标题】:Else statement never reach 【发布时间】:2021-11-02 23:57:28 【问题描述】:我有一个 if 语句与 Linq 中的查询对齐以在我的应用程序中创建登录名,但是,代码工作不好,当查询不选择任何记录时,.Count() 它等于零并且它有道理,但是在 if 中,代码永远不会到达 else 部分,看,这是我的代码:
var UserLogin = from m in _context.User where m.Username.Contains(this.Username) & 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);
【问题讨论】:
不完全确定您要做什么。你得到一个错误还是什么?永远无法到达 else 部分的唯一其他原因是 if 块正在执行。在运行时检查 UserLogin.Count() 的值,你可能会得到一个线索 您是否手动将代码与您的 Linq 查询对齐?不要那样做,这很混乱。 顺便说一句,您对用户名和密码的比较存在严重的安全漏洞。m.Password.Contains(this.Password)
- 请不要将密码保存为纯文本。 散列它们。
【参考方案1】:
请注意,查询会执行两次。第一次拨打UserLogin.Count()
时。第二次拨打UserLogin.First()
时。但是,您已经将Username
和Password
设置为string.Empty
,并且所有用户名和密码都包含一个空字符串,因为String.Contains 仅测试字符串的一部分是否匹配。所以你得到了结果中的所有用户。使用==
测试整个字符串。
由于您只想获取一个用户,请使用FirstOrDefault,当找不到用户时返回null
。
var userLogged = _context.User
.FirstOrDefault(u => u.Username == Username && 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
两次。如果您总是想这样做,请在 if-else 之后清除它们,或者仅在找不到用户时才这样做。
【讨论】:
【参考方案2】:这是因为您正在使用延迟执行 LINQ 查询。您的查询在 if 条件下执行,您将获得 count 1。
使用下面的代码 -
var UserLogin = from m in _context.User where m.Username.Contains(this.Username) & 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 条件。
【讨论】:
以上是关于否则声明永远不会到达的主要内容,如果未能解决你的问题,请参考以下文章
对 creatorUserRecordID 的 CKSubscription 永远不会到达