string.equals函数无法正常工作c#
我陷入了一个非常简单的问题,我只是在比较LINQ查询的where子句中c#中的两个字符串。但它对区分大小写不起作用。我累了。 这是我的密码string.equals函数无法正常工作c#,c#,.net,string,linq,C#,.net,String,Linq,我陷入了一个非常简单的问题,我只是在比较LINQ查询的where子句中c#中的两个字符串。但它对区分大小写不起作用。我累了。 这是我的密码 public class User { [Key()] public long ID { get; set; } [Required] public string Fname { get; set; } [Required] [Display(Name = "Last Name")] public
public class User
{
[Key()]
public long ID { get; set; }
[Required]
public string Fname { get; set; }
[Required]
[Display(Name = "Last Name")]
public string Lname { get; set; }
[DataType(DataType.PhoneNumber)]
public string Ph_Num { get; set; }
public string CNIC { get; set; }
[Required]
[Display(Name="Username")]
public string Username { get; set; }
[Required]
public string Password { get; set; }
public string Designation { get; set; }
public DateTime CreatedDate { get; set; }
}
我的cs代码看起来像
public ActionResult Index(string username, string password)
{
if (username != "" && password != "")
{
//checking is user already exists
//Here problem arise...
var query = db.Users.Where(i => i.Username.Equals(username)).ToList();
User res = null;
if(query.Count == 1)
{
res = query.First();
}
if (res != null)
{
//My remaining code
}
}
return View("Index");
}
在比较LINQ lamda表达式中的两个字符串值时,默认情况下会进行区分大小写的比较。但是,如果不希望出现这种行为,可以使用另一个重载为
Equals
的方法,该方法将比较类型enum作为第二个参数,并且可以传递所需的比较类型(区分大小写或不区分大小写)。对于不区分大小写的比较,您可以传递StringComparison.CurrentCultureIgnoreCase
var resultsWithCaseIgnored = someEntityList.Where(i => i.Name
.Equals("scott",StringComparison.CurrentCultureIgnoreCase)).ToList();
但是当您执行LINQ to SQL语句时,它将生成一个SQL语句并执行它,生成的SQL对于这两个重载都是相同的。
SQL语句中where子句的大小写敏感度取决于数据库服务器/数据库/特定列上的排序规则设置
您可以通过执行sql语句来验证当前设置,如
SELECT CONVERT (varchar, SERVERPROPERTY('collation'));
当我在我的sql server中运行这个时,得到的结果是“sql拉丁语通用CP1 CI作为”。CI
部分指出,它不区分大小写。这意味着当我执行where UserName='scott'
和where UserName='scott'
时,两者都会给出相同的结果
如果要进行区分大小写的检查,有几种方法可以将排序规则更新为区分大小写的排序规则。但是,更新数据库并不总是一件安全的事情(想想它的含意)
您可以做的是,查询db表,将结果发送到C#对象,然后执行where子句(,它将区分大小写)
问题不在C#。。。问题在于你的SGBD。例如,在SQL Server中检查您的区域性设置。如果它是包含“CI”的东西,那么所有东西都将以不敏感的方式进行比较。这是因为您看到的只是一个表达式树,它被转换为普通SQL并在SGBD上执行。更多详情:
注意:您可以通过在LINQ查询中调用“ToUpper”或“ToLower”来欺骗这一点:
public ActionResult Index(string username, string password)
{
if (username != "" && password != "")
{
//checking is user already exists
//Here problem arise...
userName = userName.ToUpperInvariant ();
var query = db.Users.Where(i => i.Username.ToUpper ().Equals(username)).ToList();
User res = null;
if(query.Count == 1)
{
res = query.First();
}
if (res != null)
{
//My remaining code
}
}
return View("Index");
}
这将在SQL中转换为类似UPPER(UserName)=“BLABLA”的内容。问题是Linq查询正在转换为SQL,因此数据库中的设置将确定比较是区分大小写还是不区分大小写。由于您希望区分大小写,但不区分大小写,我建议使用
aseneumerable
var query = db.Users.Where(i => i.Username == username)
.AsEnumerable()
.Where(i => i.Username == username)
.ToList();
基本上,这将确保在代码中执行第二个
,而不是转换为SQL。因为C#中的字符串比较区分大小写,所以您应该得到您想要的。注意,您仍然希望保留第一个Where
,以确保不会从数据库返回表中的所有行,这可能会带来成本。您将以不区分大小写的方式返回匹配的行,其中也将包括任何区分大小写的匹配。这是什么意思:“它不区分大小写”?您确切地说“但它不区分大小写”是什么意思?你想知道它是不区分大小写还是区分大小写的吗?我对LINQ to SQL的了解还不够,不知道你的“where”lambda会发生什么,但下面是如何在纯C中进行不区分大小写的比较:请注意,string.Equals(string)
将在C中进行区分大小写的比较。不过,这将转换为SQL,因为看起来您使用的是EF或Linq to SQL。这意味着比较是否区分大小写取决于您的数据库及其设置。Will EF或Linq To Sql的可能副本实际上适用于等于
的重载?谢谢您的回答,Shyju,但我不想忽略区分大小写。我想比较区分大小写。正如在问题和评论中提到的。@juharr它不会崩溃。但实际上,它为两个重载生成相同的SQL语句。所以这并不重要。你的评论让我今天学到了一些新东西(SQL排序规则)。谢谢。@AdnanInayat查看更新后的答案,以了解可能的根本原因和解决方案。如果设置不敏感,则没有必要使用ToUpper
如果设置区分大小写,则需要对变量和列执行ToUpper
以获得不敏感的比较。当DB不敏感时,获得区分大小写过滤的唯一方法是在Linq中对对象进行过滤
var query = db.Users.Where(i => i.Username == username)
.AsEnumerable()
.Where(i => i.Username == username)
.ToList();