我有一个包含带重音字符的名称的数据库表。比如ä
等等。
我需要从包含某些子串的表中使用EF4获取所有记录,而不管重音。
以下代码:
myEntities.Items.Where(i => i.Name.Contains("a"));
应返回名称中包含a
的所有项目,以及包含ä
,â
等所有项目。这可能吗?
答案 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"));