Запрос $ 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}
};
Это не зависит от базы данных. Даже если вы выполняете запрос к базе данных нечувствительным к регистру образом, тогда OData выполнит собственную дополнительную фильтрацию и отфильтрует ваши данные.