使用Entity Framework搜索数据库时忽略重音

时间:2011-06-15 12:01:45

标签: c# entity-framework non-ascii-characters

我有一个包含带重音字符的名称的数据库表。比如ä等等。

我需要从包含某些子串的表中使用EF4获取所有记录,而不管重音

以下代码:

myEntities.Items.Where(i => i.Name.Contains("a")); 

应返回名称中包含a的所有项目,以及包含äâ等所有项目。这可能吗?

4 个答案:

答案 0 :(得分:12)

如果在“名称”列上设置了不区分重音的排序顺序,则查询应按要求运行。

答案 1 :(得分:6)

设置不区分重音的排序规则可以解决问题。

您可以使用下一个查询更改SQL Server和Azure数据库中列的排序规则。

ALTER TABLE TableName
ALTER COLUMN ColumnName NVARCHAR (100)
COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI NOT NULL

SQL_LATIN1_GENERAL_CP1_CI_AI是整数,LATIN1_GENERAL是英语(美国),CP1是代码页1252,CI不区分大小写,AI是重音不敏感的。

答案 2 :(得分:0)

我知道这不是那么干净的解决方案,但在阅读this之后我试过这样的事情:

var query = this.DataContext.Users.SqlQuery(string.Format("SELECT *  FROM dbo.Users WHERE LastName like '%{0}%' COLLATE Latin1_general_CI_AI", parameters.SearchTerm));

之后,您仍然可以在'query'对象上调用方法,如Count,OrderBy,Skip等。

答案 3 :(得分:-3)

Stuart Dunkeld建议的口音不敏感校对绝对是最好的解决方案......

但也许很高兴知道:

迈克尔卡普兰曾发表关于剥夺变音符号的文章:

static string RemoveDiacritics(string stIn)
{
    string stFormD = stIn.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();

    for(int ich = 0; ich < stFormD.Length; ich++)
    {
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
        if(uc != UnicodeCategory.NonSpacingMark)
        {
            sb.Append(stFormD[ich]);
        }
    }

    return(sb.ToString().Normalize(NormalizationForm.FormC));
}

<强> Source

所以你的代码是:

myEntities.Items.Where(i => RemoveDiacritics(i.Name).Contains("a"));