Никогда не используйте .ToLower()
для сравнения без учета регистра. И вот почему:
- Возможно, это неправильно (ваша сортировка клиента может быть, скажем, турецкой, а ваша сортировка БД - нет).
- Это очень неэффективно; Излучаемый SQL равен
LOWER
вместо =
с сортировкой без учета регистра.
Вместо этого используйте StringComparison.OrdinalIgnoreCase
или StringComparison.CurrentCultureIgnoreCase
:
var q = from f in Context.Foos
where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase)
select f;
Но для Contains()
есть проблема: в отличие от Equals
, StartsWith
и т. Д., Он не перегружен для аргумента StringComparison
. Зачем? Хороший вопрос; спросите у Microsoft.
Это в сочетании с ограничением SQL Server для LOWER
означает, что не существует простого способа сделать то, что вы хотите.
Возможные обходные пути:
- Используйте полнотекстовый индекс и выполните поиск в процедуре.
- Используйте
Equals
или StartsWith
вместо этого, если это возможно для вашей задачи
- Изменить параметры сортировки по умолчанию для столбца?