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