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

时间:2015-01-23 15:59:12

标签: c# string entity-framework equals

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,...等的用户,据我所知{{1区分大小写,但我的功能不起作用。知道为什么这不起作用吗?我尝试使用比较,但这不起作用,因为它返回一个int。

3 个答案:

答案 0 :(得分:3)

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

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

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上过滤或排序的任何查询,因此在进行更改之前,请在单独的环境中进行大量测试。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

excists = true;

exists = true;