Linq执行不区分大小写的比较

本文关键字:比较 大小写 执行 不区 Linq | 更新日期: 2023-09-27 18:12:04

我想要用户对象只有当确切的密码和大小写匹配。然而,这个查询即使在大小写不相同的情况下也会获取结果:

db.Users.Where(u => u.Username.ToLower() == username.ToLower() &&
                        u.Password == password).FirstOrDefault();

我错过了什么?

Linq执行不区分大小写的比较

最简单的方法是在数据库中按照不区分大小写的规则进行用户名匹配,在。net中按照区分大小写的规则进行密码匹配:

db.Users.Where(u => u.Username == username).ToList().Where(u => u.Password == password).FirstOrDefault();

ToList()从基于数据库的LINQ移动到基于对象的LINQ,因为无论如何只有一个匹配的情况,这样做的性能影响是可以忽略不计的。

仍然有在数据库中存储密码的问题!

如果数据库被配置为不区分大小写,那么就不能让它对密码进行区分大小写的比较(除非您使用TSQL技巧)。然而!不应该存储密码—应该存储加盐散列(理想情况下是每个用户加盐)。并且哈希值(作为blob)应该可以用这种方式进行比较。

尝试:

db.Users.Where(u => string.Compare(u.Username, username, System.StringComparison.OrdinalIngoreCase) == 0 &&
                    string.Compare(u.Password, password) == 0).FirstOrDefault();

因为这是在SQL中执行的,所以你不能使用。net/linq比较方法

更改Users表中Password列的排序规则,以使用区分大小写的排序规则,如Latin1_General_CS_AS。

或者,正如其他人所评论的那样,考虑更改您的解决方案以存储密码的哈希值(例如SHA1哈希值),并比较哈希值而不是明文密码。

密码的数据库类型是什么,您使用的排序顺序是什么?

如果它是VARCHAR并且您使用不区分大小写的排序,那么您所描述的行为正是所期望的。

一些数据库的默认排序顺序可能是不区分大小写的(例如,看看SQL SERVER - Collate - Case Sensitive SQL Query Search),所以你可能在不知不觉中使用了不区分大小写的排序。显然,您需要更改排序规则以获得正确的结果。

如果u.Passwordpassword是字符串类型,那么您的代码应该按预期工作

试着这样修改你的列:

alter table [Users] alter column [password] nvarchar(100) collate Chinese_PRC_CS_AI