字符串“nfnfn”匹配“nFnFN”并返回true - 我希望它返回false

时间:2015-09-24 13:13:53

标签: c# sql-server entity-framework

我有代码检查数据库上的2个字符串。问题是它会忽略套管,所以abc123与ABC123相同,我不喜欢这样。我希望用户准确输入字符串。

这是我的代码:

public bool Consultant(string test, string test2)
{
    return db.Consultants.Any(x => x.Test == test && x.Test2 == test2);
}

不使用查询,该方法为我生成一个。

2 个答案:

答案 0 :(得分:2)

我假设此查询被转换为SQL,并且数据库使用不区分大小写的排序规则。

有几种方法可以解决这个问题。

  1. 更改数据库定义以使用区分大小写的排序规则。
  2. 将排序规则作为查询的一部分传递

    您的ORM可能不支持此操作,如果索引使用不同的排序规则,它可能会阻止使用索引。

    布拉德利·乌夫纳(Bradley Uffner)联系了一种为EF做这件事的方法:Case sensitive search using Entity Framework and Custom Annotation

  3. 数据库中的预过滤(不区分大小写)以有效减少结果数量。然后作为第二步过滤器严格使用LINQ到对象。

    public bool Consultant(string test, string test2)
    {
        var candidates = db.Consultants.Where(x => x.Test == test && x.Test2 == test2);
        return candidates.AsEnumerable().Any(x => x.Test == test && x.Test2 == test2);
    }
    

    如果使用这种方法,请不要忘记添加评论,因为这很难直观。

    这种方式通常不如替代方案,所以如果它们可用,你应该更喜欢它们。

答案 1 :(得分:-1)

您需要执行区分大小写的搜索,如下所示:

public bool Consultant(string test, string test2)
{
    return db.Consultants.Any(x => String.Compare(x.Test, test, false) == 0 && String.Compare(x.Test2, test2, false) == 0);
}