Чтобы игнорировать регистр и диакритические знаки (диакритические знаки), вы можете сначала определить такой метод расширения:
public static string RemoveDiacritics(this String s)
{
String normalizedString = s.Normalize(NormalizationForm.FormD);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < normalizedString.Length; i++)
{
Char c = normalizedString[i];
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
(Изменено из Игнорирование букв с диакритическими знаками при сравнении строк)
Теперь вы можете запустить свой запрос:
string queryText = filter.ToUpper().RemoveDiacritics();
var result = from p in People
where p.Name.ToUpper().RemoveDiacritics() == queryText
select p;
Это нормально, если вы просто перебираете коллекцию в C #, но если вы используете LINQ to SQL, предпочтительнее избегать нестандартных методов (включая методы расширения) в вашем запросе LINQ. Это связано с тем, что ваш код не может быть преобразован в действительный SQL и, следовательно, запущен на SQL Server со всей его прекрасной оптимизацией производительности.
Поскольку стандартного способа игнорирования акцентов в LINQ to SQL не существует, в этом случае я бы предложил изменить тип поля, в котором вы хотите выполнять поиск, на нечувствительность к регистру и диакритическому знаку (CI_AI).
С вашим примером:
ALTER TABLE People ALTER COLUMN Name [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI
Теперь ваш запрос должен игнорировать ударение и регистр.
Обратите внимание, что вам нужно будет временно удалить все уникальные ограничения для поля перед выполнением вышеуказанного запроса, например
ALTER TABLE People DROP CONSTRAINT UQ_People_Name
Теперь ваш запрос LINQ будет просто:
var result = from p in People
where p.Name == filter
select p;
См. Соответствующий вопрос здесь.
person
Dunc
schedule
16.11.2011