检查用户名是否存在,区分大小写

Checking if usernames exists, case-sensitive

public bool CheckUsername(string username)
{
    bool exists=false;

    var query =
        from t in db.Coaches
        where String.Equals(t.user_name,username)
        select t;


    List<Coach> coaches = query.ToList();
    if (coaches.Count!=0)
    {
        exists = true;
    }
    else
    {
        exists = false;
    }
    return exists;
}

这是我的职责。例如,如果用户名 james 存在,我希望用户仍然能够使用用户名 JamesJAMES、...等创建另一个用户,据我所知 [=14] =] 区分大小写,但我的功能不起作用。知道为什么这不起作用吗?我尝试使用比较,但这不起作用,因为它 returns 一个 int.

我的猜测是,虽然 String.Equals 通常可能区分大小写,但数据库在其查询中设置为不区分大小写。您可能需要修改数据库以将字段设置为区分大小写。

您有拼写问题。更改以下内容:

excists = true;

exists = true;

String.equals() 区分大小写,但 EF 会将其转换为 SQL,这可能不区分大小写,具体取决于该列的排序规则(或者您的数据库,如果该列没有指定的排序规则)。

您可以通过将该列的排序规则设置为区分大小写来在服务器端解决此问题

ALTER TABLE Coaches
ALTER COLUMN user_name VARCHAR(20)  // or whatever the size of your username column is
COLLATE Latin1_General_CS_AS

或者在客户端通过拉回与不区分大小写的搜索相匹配的所有记录,然后在 Linq-To-Objects 中过滤:

var query =
    from t in db.Coaches
    where String.Equals(t.user_name,username)
    select t;

// use `AsEnumerable()` to change to linq-to-objects
exists = query.AsEnumerable()
              .Any(i ==> i.user_name == username);

只要你没有成千上万的用户使用不同大小写的相同用户名,你就不应该通过在 linq-to-objects 中过滤产生太大的影响。

请注意,更改列的排序规则将影响 任何 username 进行过滤或排序的查询,因此在进行此操作之前,请在单独的环境中进行大量测试改变。