Чтобы игнорировать регистр и акценты (диакритические знаки), вы можете сначала определить метод расширения следующим образом:
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;
См. связанный вопрос здесь .