Запрос Odata для выбора пустых массивов при расширении - PullRequest
0 голосов
/ 18 марта 2020

Я явно новичок в запросах OData и могу воспользоваться некоторыми рекомендациями. Я надеюсь использовать $ filter для фильтрации результатов, и я не могу найти хороший ресурс для синтаксиса. Я использую Odata, чтобы выбрать таблицу A, развернуть свойство навигацииB и сосчитать все вхождения, где B равно 1) пустой массив, 2) имеет количество объектов 1 или 3) число объектов больше 1. Вот пример, где я хочу расширить на propertyB. Любая помощь, конструктивная критика очень ценится!

http://{{baseUrl}}/odata/tableA?&$top=50&$count=true&$expand=propertyB

Теперь я пытаюсь использовать функцию фильтра, чтобы отфильтровать только данные, которые имеют свойство B в качестве пустого массива.

          {
            "myNumber": "00000056218",
            "actionType": null,
            "numberXTimes": [],
            "propertyB": []

          }

Вот пример, где я хотел бы получить возвращаемые значения, показывающие, что у "propertyB" есть один объект:

http://{{baseUrl}}/odata/tableA?&$top=50&$expand=propertyB&$filter=contains(propertyB/myNumber, (myNumber.Length ==1))&$count=true

         {
            "myNumber": "00000056218",
            "actionType": null,
            "numberXTimes": [],
            "propertyB": [
                     {
                    "myNumber": "00000056218",
                    "desiredId": 300387799,

                }
             ]

          }

К сожалению, мои запросы не работают. Я хотел бы вашей помощи, чтобы понять это. Заранее спасибо!

1 Ответ

1 голос
/ 20 марта 2020

У меня нет точного решения для вас, но я могу предоставить несколько обходных путей.

Во-первых, вы можете использовать $count в параметре expand , чтобы получить количество элементов, присутствующих в propertyB. Это будет выглядеть примерно так:

http://{{baseUrl}}/odata/tableA?&$top=50&$count=true&$expand=propertyB($count=true)

ответ будет:

{
  "myNumber": "00000056218",
  "actionType": null,
  "numberXTimes": [],
  "propertyB@odata.count": 1,
  "propertyB": [
    {
      "myNumber": "00000056218",
      "desiredId": 300387799
    }
  ]
}

Но при этом вы просто получаете счетчик и фактически не фильтруете результаты.

В качестве альтернативы вы можете использовать лямбда-функцию any() OData , чтобы получить только те записи, для которых propertyB является не пустыми , и отфильтровать остальные.

http://{{baseUrl}}/odata/tableA?&$top=50&$count=true&$expand=propertyB&$filter=propertyB/any()

Я надеюсь, что эти обходные пути подойдут для вашей ситуации.

...