Ответ 1
Если вы установили порядок сортировки без учета акцентов в столбце Имя, тогда запросы должны работать по мере необходимости.
У меня есть таблица базы данных, содержащая имена с акцентированными символами. Как ä
и т.д.
Мне нужно получить все записи, используя 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
- нечувствительна к акценту.
Я знаю, что это не так чистое решение, но после прочтения 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 и т.д.
Акцентно-чувствительная сортировка, предложенная Стюартом Данкельдом, безусловно, является лучшим решением...
Но, может быть, полезно знать:
Майкл Каплан однажды опубликовал сообщение об лишении диакритики:
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"));