Игнорирование акцентов при поиске в базе данных с использованием Entity Framework - PullRequest
13 голосов
/ 15 июня 2011

У меня есть таблица базы данных, которая содержит имена с акцентированными символами.Как ä и т. Д.

Мне нужно получить все записи, используя EF4, из таблицы, содержащей некоторую подстроку , независимо от акцентов .

Итак, следующий код:

myEntities.Items.Where(i => i.Name.Contains("a")); 

должен вернуть все элементы с именем, содержащим a, но также все элементы, содержащие ä, â и т. Д.Это возможно?

Ответы [ 4 ]

13 голосов
/ 15 июня 2011

Если вы установили нечувствительный к акценту порядок сортировки в столбце Имя, тогда запросы должны работать как требуется.

6 голосов
/ 03 июля 2015

Установка сортировки без учета акцента решит проблему.

Можно изменить параметры сортировки для столбца в базе данных 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 - без учета ударения.

0 голосов
/ 18 февраля 2014

Я знаю, что это не очень чистое решение, но после прочтения этого я попробовал что-то вроде этого:

var query = this.DataContext.Users.SqlQuery(string.Format("SELECT *  FROM dbo.Users WHERE LastName like '%{0}%' COLLATE Latin1_general_CI_AI", parameters.SearchTerm));

После этого вы все еще можете вызывать методы для запроса.такие объекты, как Count, OrderBy, Skip и т. д.

0 голосов
/ 15 июня 2011

Нечувствительная к акценту сортировка, как предположил Стюарт Данкелд, безусловно, является лучшим решением ...

Но, возможно, полезно знать:

МайклКаплан однажды написал о разборке диакритических знаков:

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")); 
...