Подтвердить что ты не робот

Выберите отдельные значения с помощью odata

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

4b9b3361

Ответ 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, и вы найдете всю необходимую помощь :)