Это смелое утверждение, но этот вопрос доказывает, что многие расширенные функции запросов не были полностью или должным образом реализованы в опубликованном сервисе. .
Хотя многие разработчики могут использовать его для практического применения концепций запросов OData, учитывая, что реализация OData в значительной степени зависит от разработчиков и версии пакетов, которые они используют, вероятно, она будет иметь более коммерческую ценность, если вы запрашиваете для live или dev реализации фактической службы, к которой вы хотите запросить.
Ниже приведен анализ запросов OP и способов достижения желаемого ответа. согласно спецификации OData-V4 и сверяется с развернутым API, использующим следующие пакеты NuGet:
- Microsoft.As pNet .OData v7.3.0
- Microsoft.OData. Core v7.6.2
Фактический API, который я использовал для тестирования, является проприетарным и не может быть опубликован здесь.
Согласно спецификации c, вы должны переместить спецификатор $top
в расширение Order_Details
.
https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?
$expand=Orders($expand=Order_Details($top=1))
Однако:
https://services.odata.org/Experimental/Northwind неправильно реализует параметр запроса $top
в расширении, как определено в 5.1.3 Параметр системного запроса $ expand
Параметры запроса можно применить к расширенному свойству навигации, добавив разделенный точкой с запятой список параметров запроса, заключенный в скобки, к имени свойства навигации. Допустимые параметры системного запроса: $filter
, $select
, $orderby
, $skip
, $top
, $count
, $search
и $expand
.
Однако $top
поддерживается в реализации ODataLib v7 + (. Net) OData v4. Таким образом, синтаксис правильный, но вам следует узнать мнение ваших разработчиков API, если ваши запросы с этим синтаксисом не работают.
ПРИМЕЧАНИЕ: При использовании $top
вы также должны использовать $orderby
, чтобы обеспечить надежность и воспроизводимость результатов запроса:
https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?
$expand=Orders($expand=Order_Details($orderby=ProductID;$top=1))
Чтобы применить несколько параметров запроса в расширение, вы должны отделить его точкой с запятой: ;
. Однако это само по себе не помешает возвращению других записей о клиентах, поэтому необходимо также добавить фильтр уровня root, что усложняется тем фактом, что Orders
является коллекцией. Мы можем использовать функцию any
, чтобы возвращать только клиентов, у которых есть заказ с указанным идентификатором:
Также обратите внимание, что OrderID
- это число c, поэтому не заключайте значения сравнения в кавычки
https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?
$expand=Orders($expand=Order_Details;$filter=OrderID eq 10643)
&$filter=Orders/any(o:o/OrderID eq 10643)
это можно еще более упростить, используя псевдоним параметра:
https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?
$expand=Orders($expand=Order_Details;$filter=OrderID eq @orderId)
&$filter=Orders/any(o:o/OrderID eq @orderId)
&@orderId='10643'
Однако:
https://services.odata.org/Experimental/Northwind неправильно реализует псевдонимы параметров , поэтому вы не можете проверить синтаксис псевдонимов для этой службы.
Также обратите внимание
, что экспериментальная служба не применяет правильно фильтр для root элементов или коллекции навигации, однако приведенный здесь синтаксис работает против. Net реализаций ODataLib OData v4.
Причина, по которой ваш $expand
не работает, заключается в том, что вы исключили $
из имени параметра. Интерпретатор запросов OData определяет только параметры запроса, параметры которых начинаются с $
. В любом случае, в соответствии с https://services.odata.org/Experimental/Northwind/Northwind.svc/ $ metadata # Regions, отсутствует Order_Details
свойство навигации для $expand
on:
<EntitySet Name="Regions" EntityType="NorthwindModel.Region">
<NavigationPropertyBinding Path="Territories" Target="Territories" />
</EntitySet>
Так что при повторной попытке с правильным синтаксис:
https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?$expand=Order_Details
получено ожидаемое сообщение:
Не удалось найти свойство с именем 'OrderID' для типа 'NorthwindModel.Region'
Вторая попытка сработает, если вы добавите туда правильный $
для опции запроса $expand
: https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions? $ Expand = Territories
Анализатор запросов OData ищет только ожидаемые параметры запроса с префиксом $
, что позволяет вашей логике API c по-прежнему обрабатывать другие не-OData параметры, как вы считаете нужным. Другие параметры по-прежнему являются параметрами, соответствующими HTTP Url, реализация odata.org не знает, что с ними делать, и они просто игнорируются.
Это просто еще один вариант той же проблемы с 3, $
отсутствует. (Я подозреваю, что этот URL должен был быть в 3: https://services.odata.org/Experimental/Northwind/Northwind.svc/Products?$expand=Suppliers
)
Таким образом, хотя https://services.odata.org/Experimental/Northwind не является надежным на 100%, ни являются. Net реализациями ODataLib, SAP или MS Dynamics. Спецификация c развивается, и есть много методов запросов, которые не полностью реализованы, вероятно, в каких-либо провайдерах на данном этапе.
Просто помните об этом факте, и когда вы сталкиваетесь с проблемами с использованием API, первое контактным лицом должны быть разработчики или сообщество, которые поддерживают этот конкретный API, разработчики сами решат, какие методы и пакеты они используют, и в конце концов, в какой степени они поддерживают протокол, как указано.