Linq to Entities: использование ToLower () в полях NText

Вот еще один способ обойти проблему:

std::min(9, int(test::N));

(я думаю, что ответ Crazy Eddie правильно описывает, почему проблема существует.)

13
задан Julien N 12 March 2010 в 20:14
поделиться

1 ответ

Никогда не используйте .ToLower () для выполнения сравнения без учета регистра. Вот почему:

  1. Возможно, это неправильно (параметры сортировки клиентов могут быть, скажем, турецкими, а параметры сортировки БД - нет).
  2. Это крайне неэффективно; Выпущенный SQL - НИЖНИЙ вместо = с сортировкой без учета регистра.

Вместо этого используйте 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 вместо этого, если это возможно для вашей задачи
  • Изменить параметры сортировки столбца по умолчанию?
29
ответ дан 1 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: