LINQ where to Match exact string

21 浏览
0 Comments

LINQ where to Match exact string

我即使不匹配大小写也能得到输出结果

例如:用户名=Demo

密码=Test 登录为用户Id=1。

用户名=dEmo 密码=test 登录为用户Id=1 请帮我使它区分大小写。

0
0 Comments

问题的原因:LINQ To Entities将Lambda表达式转换为SQL语句,而SQL Server默认的排序规则(Collation)是不区分大小写的(SQL_Latin1_General_CP1_CI_AS)。这就导致了在使用LINQ To Entities时,字符串匹配是不区分大小写的。

解决方法:可以使用ObjectQuery.ToTraceString方法来查看实际提交给SQL Server的生成的SQL查询语句,以便更好地了解问题所在。另外,如果需要进行大小写敏感的字符串匹配,可以考虑以下解决方案。

示例代码:

var demo = ((ObjectQuery)context.UserDetails.SingleOrDefault(x => x.UserName == UserName && x.Password == Password)).ToTraceString();

更多详情请参考:[https://stackoverflow.com/questions/3843060](https://stackoverflow.com/questions/3843060)

假设排序规则是大小写敏感的,并且系统需要在许多nvarchar索引上进行搜索。那么你会推荐什么解决方案呢?我认为这不是解决问题的方法。

0
0 Comments

在这段代码中,使用了Equals方法来进行字符串的匹配。这种方法能够解决在LINQ查询中模糊匹配字符串的问题。

var demo = context.UserDetails.SingleOrDefault(x => x.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase) && x.Password.Equals(Password, StringComparison.CurrentCulture);

在这段代码中,我们使用了Equals方法来比较字符串。这种方法会在数据层面进行字符串比较,因此不需要担心数据库的排序规则。如果数据库的排序规则支持大小写敏感,那么LINQ转换的SQL查询在大小写不匹配的情况下将不会返回任何结果。但是如果排序规则不支持大小写敏感,那么SQL查询将返回结果,即使大小写不匹配。这就是使用Equals操作符的原因,它能够解决这个问题。

通过使用Equals方法,我们可以确保字符串的匹配是精确的,而不会受到排序规则的影响。这样可以提高查询的准确性和可靠性。尽管使用明文密码是不推荐的,但是通过这种方法可以避免数据库排序规则的问题。

总结起来,使用Equals方法可以解决LINQ查询中模糊匹配字符串的问题。这种方法通过在数据层面进行字符串比较,确保了匹配的准确性和可靠性。如果数据库的排序规则支持大小写敏感,那么LINQ转换的SQL查询将不会返回大小写不匹配的结果。而如果排序规则不支持大小写敏感,使用Equals方法可以解决这个问题。

0