使用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"));