Entity Framework Core Cosmos Db — Как сравнивать строки без учета регистра?

#c# #database #entity-framework-core #azure-cosmosdb

#c# #База данных #entity-framework-core #azure-cosmosdb

Вопрос:

Я попробовал несколько вариантов:

 entity.FirstOrDefaultAsync(x => string.Equals(x.Id, Id, StringComparison.OrdinalIgnoreCase));
entity.FirstOrDefaultAsync(x => x.Id.Equals(Id, StringComparison.OrdinalIgnoreCase));
  

Также опробованный ToUpper() метод:

 var IdUpper = Id.ToUpper();
entity.FirstOrDefaultAsync(x => x.Id.ToUpper() == idUpper); 
  

Но все решения выдают ошибку:

Система.Исключение InvalidOperationException: выражение LINQ не удалось перевести

Есть ли решение, которое поддерживало бы EF Core для Cosmos Db?

Комментарии:

1. Строки сравниваются базой данных на основе сопоставления полей — это определяет порядок сортировки, правила равенства символов и т.д. То, что вы пробовали, также не сработало с SQL Server. Поскольку параметры сортировки определяют порядок сортировки, это также влияет на построение индексов, поэтому вам не следует пытаться переопределить параметры сортировки поля. В итоге вы получите полное сканирование таблицы, поскольку серверу придется проверять каждое отдельное значение, чтобы увидеть, совпадает ли оно с использованием новой сортировки

2. Нечувствительные к регистру StringEquals были добавлены в CosmosDB только в июне этого года. Какую версию поставщика EF Core / CosmosDB вы используете? Старые поставщики не будут поддерживать эту функциональность.

3. Рад это слышать — я не смог найти никаких примечаний к выпуску или соответствующих проблем с Github

4. Теперь я проверил, что Equals работает нормально, но не работает с параметром сравнения типов (StringComparison. OrdinalIgnoreCase) Я получаю ту же ошибку.

5. После проверки зависимостей поставщика похоже, что первая версия поставщика CosmosDB с зависимостью от SDK, в которой введена нечувствительность к регистру, равна 5.0 RC1

Ответ №1:

Нечувствительные к регистру StringEquals были добавлены в CosmosDB только в июне этого года. Вы должны обновить свой поставщик EF Core Cosmos до последней версии. Версии, выпущенные до июня 2020 года, не будут иметь этой функции.

Я не могу найти никаких примечаний к выпуску или проблем с GitHub, в которых указывалось бы, в какой версии впервые были введены сравнения, зависящие от регистра, поэтому я не могу сказать, в какой версии была введена эта функция. Зависимости пакетов показывают, что версия 5.0 RC1 является первой, которая использует явную зависимость от CosmosDB SDK с этой функцией.

В случае проблем, вероятно, лучше использовать Cosmos .NET SDK напрямую.

Что касается того, почему это вообще проблема, сравнение строк выполняется на сервере на основе сопоставления полей. Сопоставление определяет порядок сортировки для использования и какие символы считаются равными. AA например, в датском языке считается одна буква, которая идет после Z. Индексы базы данных создаются с использованием этой сортировки, поэтому попытка поиска значений с использованием другой сортировки не сможет использовать какие-либо существующие индексы. Сервер вынужден сканировать все данные и вычислять равенство и порядок. Использование таких функций так ToLower() же дорого.