Это сравнение в LINQ to Entities не учитывает регистр:
Thingies.First(t => t.Name == "ThingamaBob");
Как добиться сравнения с учетом регистра с LINQ to Entities?
c#
.net
entity-framework-4
linq-to-entities
Ронни Оверби
источник
источник
Ответы:
Это потому, что вы используете LINQ To Entities, который в конечном итоге преобразует ваши лямбда-выражения в операторы SQL. Это означает, что чувствительность к регистру находится во власти вашего SQL Server, который по умолчанию имеет сопоставление SQL_Latin1_General_CP1_CI_AS и НЕ чувствителен к регистру.
Использование ObjectQuery.ToTraceString для просмотра сгенерированного запроса SQL, который был фактически отправлен в SQL Server, раскрывает тайну:
Когда вы создаете запрос LINQ to Entities , LINQ to Entities использует синтаксический анализатор LINQ, чтобы начать обработку запроса и преобразовать его в дерево выражений LINQ. Затем дерево выражений LINQ передается в API объектных служб , который преобразует дерево выражений в дерево команд. Затем он отправляется поставщику хранилища (например, SqlClient), который преобразует дерево команд в текст команды собственной базы данных. Запрос выполняется в хранилище данных, и результаты материализуются в объекты сущности с помощью служб объектов., Никакой логики для учета чувствительности к регистру не использовалось. Таким образом, независимо от того, какой регистр вы укажете в своем предикате, он всегда будет обрабатываться вашим SQL Server как один, если вы не измените параметры сортировки SQL Server для этого столбца.
Решение на стороне сервера:
Поэтому лучшим решением было бы изменить параметры сортировки столбца Name в таблице Thingies на COLLATE Latin1_General_CS_AS, который чувствителен к регистру, запустив это на вашем SQL Server:
Для получения дополнительной информации о SQL Server Collates , взгляните на SQL SERVER Collate с учетом регистра SQL Query Search
Клиентское решение:
Единственное решение, которое вы можете применить на стороне клиента, - это использовать LINQ to Objects, чтобы провести еще одно сравнение, которое не выглядит очень элегантным:
источник
Вы можете добавить аннотацию [CaseSensitive] для EF6 + Code-first
Добавить эти классы
Измените свой DbContext, добавьте
Тогда сделай
Надстройка миграции CaseSensitive
Обновление базы данных
на основе статьи https://milinaudara.wordpress.com/2015/02/04/case-sensitive-search-using-entity-framework-with-custom-annotation/ с исправлением некоторых ошибок
источник
WHERE
Условия в SQL Server по умолчанию нечувствительны к регистру. Сделайте регистр чувствительным, изменив параметры сортировки столбца по умолчанию (SQL_Latin1_General_CP1_CI_AS
) наSQL_Latin1_General_CP1_CS_AS
.Хрупкий способ сделать это - использовать код. Добавьте новый файл миграции, а затем добавьте его внутри
Up
метода:Но
Вы можете создать настраиваемую аннотацию под названием CaseSensitive, используя новые функции EF6, и украсить свои свойства следующим образом:
В этом сообщении блога объясняется, как это сделать.
источник
Ответ @Morteza Manavi решает проблему. Тем не менее, для решения на стороне клиента элегантным способом будет следующий (добавление двойной проверки).
источник
Мне понравился ответ Мортеза, и обычно я предпочел бы исправить на стороне сервера. На стороне клиента я обычно использую:
По сути, сначала проверяется, есть ли пользователь с требуемыми критериями, а затем проверяется, тот же ли пароль. Немного многословно, но я чувствую, что его легче читать, когда может быть задействован целый ряд критериев.
источник
Ни один из них не
StringComparison.IgnoreCase
работал у меня. Но это произошло:источник
How can I achieve case sensitive comparison
Используйте string.Equals
Кроме того, вам не нужно беспокоиться о null и получить только ту информацию, которую вы хотите.
Используйте StringComparision.CurrentCultureIgnoreCase для нечувствительности к регистру.
источник
Не уверен насчет EF4, но EF5 это поддерживает:
источник
StringComparison
перечисление иметь значение. Я видел достаточно людей, предлагающих такие вещи, чтобы думать, что проблема где-то в файле EDMX (db-first), хотя stackoverflow.com/questions/841226/…