string.equals函数无法正常工作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

我陷入了一个非常简单的问题,我只是在比较LINQ查询的where子句中c#中的两个字符串。但它对区分大小写不起作用。我累了。 这是我的密码

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();