如何在EF中比较区分大小写的字符串?

时间:2011-06-13 20:10:28

标签: linq entity-framework-4 asp.net-membership

使用EF的会员提供者ValidateUser非常简单

public override bool ValidateUser(string username, string password)
{
    // Validate User Credentials
    var r = db.ST_Users.FirstOrDefault(
                           x => x.Username.Equals(username) && 
                                x.Password.Equals(password));
    return r != null ? true : false;
}

但无论我使用true还是balexandre,都会返回BAleXanDre(查找并检索空洞对象)。

  

如何在区分大小写模式下启用EF进行比较?

我知道如何比较不区分大小写(使用StringComparison.CurrentCultureIgnoreCase重载,但我只是想要相反)

3 个答案:

答案 0 :(得分:8)

您不应该查询密码。您应该检索User对象并在本地进行密码比较,因为默认情况下SQL服务器会对您进行不区分大小写的比较(除非您更改数据库设置,这不是您应该轻视的)。

var r = db.ST_Users.SingleOrDefault(x => x.Username == username);

return r != null && r.Password == password;

此外,您似乎在数据库中存储普通密码。根据应用程序的类型,这可能不是一个好主意。尝试用盐对它们进行哈希处理。在Stackoverflow上可以找到很多关于它的好信息。例如,请查看this questionthis website

答案 1 :(得分:0)

你试过吗

x => x.Username == username && x.Password == password

而不是使用Equals()

也许this post可以帮助您进一步

答案 2 :(得分:0)

我遇到了同样的问题。我试过了:

1. from p in entity.SecurityUsers where p.userName.Equals(userName) && p.password.Equals(password) select p
2. from p in entity.SecurityUsers where p.userName == userName && p.password == password select p

但这两个都不起作用。然后我选择了USER ..,

var user = (from p in entity.SecurityUsers where p.userName == userName select p).first();

然后比较密码:

return p != null && p.Password == password;