【问题标题】: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) - 请不要将密码保存为纯文本。 散列它们。

标签: c# asp.net linq


【解决方案1】:

请注意,查询会执行两次。第一次拨打UserLogin.Count()时。第二次拨打UserLogin.First()时。但是,您已经将UsernamePassword 设置为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;
}

您将UsernamePassword 设置为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 条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 2020-04-12
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多