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

| 我有一个数据库表,其中包含带重音符号的名称。像
ä
等。 我需要从包含一些子字符串的表中获取所有使用EF4的记录,而不管重音。 所以下面的代码:
myEntities.Items.Where(i => i.Name.Contains(\"a\")); 
应该返回名称包含
a
的所有项目,还应返回包含
ä
â
等的所有项目。这可能吗?     
已邀请:
        如果在“名称”列上设置了不区分重音的排序顺序,则查询应按要求工作。     
        设置不区分重音的排序规则将解决此问题。 您可以在下一个查询中更改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
不区分重音。     
        我知道这不是很干净的解决方案,但是在阅读本文之后,我尝试了以下方法:
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等。     
        Stuart Dunkeld建议的对口音不敏感的排序规则绝对是最佳解决方案... 但也许很高兴知道: 迈克尔·卡普兰(Michael Kaplan)曾经发表过一篇关于剥离变音符号的文章:
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));
}
资源 因此您的代码将是:
myEntities.Items.Where(i => RemoveDiacritics(i.Name).Contains(\"a\")); 
    

要回复问题请先登录注册