Я пытаюсь создать вызов odata webservice, который будет выбирать только отдельные значения некоторого свойства. Есть ли хороший пример того, как это сделать?
Выберите отдельные значения с помощью odata
Ответ 1
В настоящее время протокол OData не поддерживает отдельный оператор или любой другой оператор, который мог бы помочь с таким запросом (предполагая, что вы ищете нечеткие значения примитивного свойства для некоторого объекта). Вы должны уметь обходить это, реализуя операцию обслуживания на сервере, которая выполняет такой запрос у базового провайдера, который обычно имеет эту способность. И тогда клиент может вызвать эту службу.
Ответ 2
Примечание: я знаю, что это старый, но все еще обнаруживается в поисковых ответах. Теперь есть хорошее решение этой проблемы.
В OData v4 существует поддержка $ apply, среди прочего, $apply
может использоваться для возврата отдельного набора полей из набора результатов.
See related discussion: Applying Distinct to ODataQuery
из спецификации OData v4,
Опция запроса$apply
принимает последовательность преобразований множества, разделенных прямой косой чертой, чтобы выразить, что они применяются последовательно, например, результат каждого преобразования является входом для следующего преобразования $ apply - это функция, которая требует
TL;DR;
По сути, если у меня есть таблица, которая имеет много полей, но я хочу вернуть только отдельные записи ряда конкретных полей, первым шагом будет определение отдельных столбцов, давайте назовем их Name
и Id
.
Просто используйте функцию $apply
, чтобы получить отдельный набор результатов, содержащий только столбцы Names и Id с синтаксисом, подобным следующему:
http://url.to/tableresource?$apply=groupby((Name,Id))
Давайте сделаем это на примере, TuberInspections
имеет 1000 строк, но только несколько подрядчиков. Я хочу отобразить имена подрядчиков в раскрывающемся списке для использования в запросе на фильтрацию.
Мои отдельные столбцы - ContractorName
и ContractorId
GET /odata/TuberInspections?$apply=groupby((ContractorName,ContractorId)) HTTP/1.1
Host: localhost:1230
Response:
{
"@odata.context": "http://localhost:1230/odata/$metadata#TuberInspections(ContractorName,ContractorId)",
"value": [
{
"@odata.id": null,
"ContractorId": 11534,
"ContractorName": "Kermit d'Frog"
},
{
"@odata.id": null,
"ContractorId": 11539,
"ContractorName": "Carlos Spicy Wiener"
},
{
"@odata.id": null,
"ContractorId": 16827,
"ContractorName": "Jen Gelfling"
}
]
}
Если ваша структура данных недостаточно плоская, поддержка OOTB для извлечения простых вложенных структур результатов ограничена.
Если его структура данных трудна для использования, и вы имеете контроль над API, вам следует подумать о создании пользовательской функции, которая будет возвращать определенный набор записей, который вы желаете, - это тривиальное упражнение, которое имеет много различных вариантов, доступных вам, но за пределами объем этого ответа.
Этот ответ направлен на то, как запросить существующую службу OData для различных значений, а не на то, как изменить службу для предоставления такой информации.
В настоящее время поддерживается только один путь навигации со следующим синтаксисом. Вышеуказанный запрос также можно записать так:
GET /odata/TuberInspections?$apply=groupby((Contractor/EntityID,Contractor/Initials))
Host: localhost:1230
Response:
{
"@odata.context": "http://localhost:1230/odata/$metadata#TuberInspections(Contractor(EntityID,Initials))",
"@odata.count": 3,
"value": [
{
"@odata.id": null,
"Contractor": {
"@odata.id": null,
"Initials": "KdF",
"EntityID": 11534
}
},
{
"@odata.id": null,
"Contractor": {
"@odata.id": null,
"Initials": "SW",
"EntityID": 11539
}
},
{
"@odata.id": null,
"Contractor": {
"@odata.id": null,
"Initials": "Jen",
"EntityID": 16827
}
}
]
}
Существуют более сложные (сложные) варианты вложенных или суммированных преобразований $apply
, которые включают в себя возврат количества уникальных строк, соответствующих каждому отдельному результату.
Для получения дополнительной информации, пожалуйста, отправьте конкретные вопросы и пометьте OData-v4, и вы найдете всю необходимую помощь :)