Игнорирование акцентов при поиске в базе данных с помощью Entity Framework

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

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

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

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

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

Ответ 1

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

Ответ 2

Настройка несимметричной сортировки будет устранять проблему.

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

Ответ 3

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

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 и т.д.

Ответ 4

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

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

Майкл Каплан однажды опубликовал сообщение об лишении диакритики:

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