使用Linq查询做登录判断时else分支永远无法执行问题
问题根因
你遇到的问题核心是LINQ查询的延迟执行特性导致的,具体问题点如下:
- 你定义的
UserLogin是LINQ查询对象,默认是延迟执行的:只有当你调用Count()、First()这类立即执行方法时,才会用当前的变量值拼接SQL执行查询 - 你在定义完查询后、调用
Count()之前,就提前把this.Username和this.Password赋值为空字符串,执行查询时相当于执行的是Username.Contains("") AND Password.Contains(""),而字符串判断包含空字符串永远返回true,所以查询永远会返回所有用户记录,Count()永远大于0,自然不会进入else分支 - 额外注意:你查询条件里用的是按位与
&而不是逻辑与&&,逻辑判断场景应该用&&更规范;同时Contains是模糊匹配,登录逻辑应该用精确相等==,否则会出现输部分账号密码就能登录的安全问题。
修复方案
调整变量清空的时机,等执行完查询判断逻辑之后再清空输入,同时修正查询条件的写法:
// 先保留输入的账号密码用于查询 var inputUsername = this.Username; var inputPassword = this.Password; // 改为精确匹配,用逻辑与 var UserLogin = from m in _context.User where m.Username == inputUsername && m.Password == inputPassword select m.Username; // 先执行查询判断,用Any()比Count()效率更高,不需要统计全量匹配数 if(UserLogin.Any()) { UsernameLogged = UserLogin.First(); } else { Console.WriteLine("Sisa: " + UsernameLogged); UsernameLogged = string.Empty; Console.WriteLine(UsernameLogged); } // 最后统一清空输入,不管登录成功还是失败都清空 this.Username = string.Empty; this.Password = string.Empty;
内容的提问来源于stack exchange,提问作者Giovanni Mosquera
相关产品推荐
相关产品推荐

