实体框架 - 不区分大小写包含?

时间:2013-01-18 14:19:44

标签: entity-framework

我想要一个不涉及ToUpper或ToLower的问题的解决方案,正如我在下面的代码中使用的那样;

var upper = term.ToUpper();
using (var db = this.DataContext)
{
    return db.Counties.Where(x => x.CountyName.ToUpper().Contains(upper)).ToList();
}

我正在使用授权框架,因此使用StringComparison.CurrentCultureIgnoreCase的C#解决方案不起作用。它适用于EqualsEndsWithStartsWith,但不适用于Contains

3 个答案:

答案 0 :(得分:6)

我知道这与EF没有直接关系,但只有我能想到的解决方案是将DB表格列整理改为Case Insensitive,例如:

ALTER TABLE TABLENAME ALTER COLUMN COLUMNNAME nvarchar(100) COLLATE Latin1_General_CI_AS NULL

CI - 不区分大小写/ CS - 区分大小写

AS - 重音敏感/ AI - 重音不敏感(也可能有用)

如果您无法更改表格列的排序规则,则可以使用EF直接查询并强制排序

select * 
from table
where country collate Latin1_General_CI_AS != @country

答案 1 :(得分:5)

我使用EF6和Sql Server,Contains映射到LIKE '%@p0%',在我的情况下不区分大小写。所以在我的情况下:

db.Counties.Where(x => x.CountyName.Contains(term)).ToList();

根据需要运作。有关Sjoerd answer的更多信息。

答案 2 :(得分:-1)

只需添加.ToLower()

中的upper即可
 using (var db = this.DataContext)
            {
                return db.Counties
                       .Where(x => x
                       .CountyName.ToLower()
                       .Contains(upper.ToLower())).ToList();
            }