Запрос $ OData условия фильтра и чувствительность к регистру

Определяет ли OData, должны ли условия фильтра для строковых полей оцениваться с учетом регистра или без учета регистра?

Пример: (из документов)

/Suppliers?$filter=Address/City eq 'Redmond' 

Ожидается ли это с учетом регистра или нет?

Если я хочу предложить оба варианта, как это можно выразить? Существует функция tolower(), которую можно использовать так:

/Suppliers?$filter=tolower(Address/City) eq 'redmond'

или же

/Suppliers?$filter=tolower(Address/City) eq tolower('Redmond')

Разве нет более краткого способа выражения сопоставления без учета регистра?

3 ответа

Решение

Оператор "eq" должен быть чувствительным к регистру. В настоящее время рекомендуется использовать tolower (или toupper).

Я ожидаю, что это зависит от параметров сортировки вашей базы данных, так как сервис odata просто выполняет запрос. Если ответ Vitek правильный, то odata выполняет некоторую фильтрацию после запроса по набору результатов, и это должно быть странно, верно?

Теперь можно выполнять сравнение без учета регистра, установив EnableCaseInsensitive = true в ODataUriResolver. Я использовал это с Microsoft.AspNetCore.OData 7.1.0.

     var oDataUriParser = new ODataUriParser(model, uri)
     {
        Resolver = new ODataUriResolver { EnableCaseInsensitive = true}
     };

Источник: https://github.com/OData/WebApi/issues/812

Это не зависит от базы данных. Даже если вы выполняете запрос к базе данных нечувствительным к регистру образом, тогда OData выполнит собственную дополнительную фильтрацию и отфильтрует ваши данные.

Другие вопросы по тегам