C# 使用实体框架搜索数据库时忽略重音符号

C# 使用实体框架搜索数据库时忽略重音符号,c#,entity-framework,non-ascii-characters,C#,Entity Framework,Non Ascii Characters,我有一个数据库表,其中包含带有重音字符的名称。比如ä等等 我需要使用EF4从包含一些子字符串的表中获取所有记录,而不考虑重音 因此,以下代码: myEntities.Items.Where(i => i.Name.Contains("a")); 应返回名称中包含a的所有项目,但也应返回包含ä和的所有项目,以此类推。这可能吗?斯图亚特·邓克尔德(Stuart Dunkeld)建议的不区分重音的排序肯定是最好的解决方案 但也许最好知道: 迈克尔·卡普兰(Michael Kaplan)曾经发

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

我需要使用EF4从包含一些子字符串的表中获取所有记录,而不考虑重音

因此,以下代码:

myEntities.Items.Where(i => i.Name.Contains("a")); 
应返回名称中包含
a
的所有项目,但也应返回包含
ä
的所有项目,以此类推。这可能吗?

斯图亚特·邓克尔德(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));
}

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

我知道这不是一个干净的解决方案,但在阅读之后,我尝试了以下方法:

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等。

设置不区分重音的排序规则将解决此问题

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

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

SQL\u LATIN1\u GENERAL\u CP1\u CI\u AI
是排序规则,其中
LATIN1\u GENERAL
是英语(美国),
CP1
是代码页1252,
CI
不区分大小写,
AI
不区分重音。

您使用的是什么数据库?您可能必须在该列上设置不区分重音的排序顺序。您可以在EF中使用此方法吗@斯图尔特·邓克尔德——这就成功了。我在数据库中更改了Name列的排序规则,然后它像一个符咒一样工作。如果您将其作为答案发布,我将投票并接受。您的示例将不起作用,因为
RemoveDiacritics
必须在SQL server上运行。正如@Ladislav所说,这将从输入字符串(可能已经没有重音)中删除重音,并检查仍然关注重音的数据库。这实际上会使情况变得更糟,因为输入–将转换为,甚至在数据库中找不到–即使用户在执行搜索时确实费心编写重音符号。但是很高兴知道有一种方法可以去除C语言中字符串的重音(我是否需要这样做;)@Øyvind Knobloch Bråthen-我以为你的输入字符串应该是
“a”
,而
I.Name
是数据库中的一个,但是的,如果口音有更多问题,这应该只是去除这些字符串的一种方法,etc=d您将如何通过代码更改特定列的排序规则?@AlejandrodelRío请参见示例,如果您已经创建了表,并且表中包含数据,则无法执行此操作。至少在SQLServer2008R2中。当您创建一个新表或一个新数据库时,根本没有问题。我的问题是关于实体框架的。谢谢。只要列排序规则没有被FK、索引、检查、计算列或分布统计信息引用,您就可以使用它。SQL的一个例子是
altertable[dbo].[table]altercolumn[ColumnName]nvarchar(MAX)collatesql\u Latin1\u General\u CP1\u CI\u AI排序规则在插入时不会删除重音吗?
ALTER TABLE TableName
ALTER COLUMN ColumnName NVARCHAR (100)
COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI NOT NULL