首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何为这些查询获得适当的结果?

如何为这些查询获得适当的结果?
EN

Stack Overflow用户
提问于 2020-02-05 13:13:09
回答 1查看 519关注 0票数 1
  1. 需要单独执行并返回每个订单的第一订单详细信息。下面不起作用

https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?$expand=Orders($expand=Order_Details;$top=1)

  1. 需要根据订单id过滤记录。下面不工作,并抛出“术语'Orders($expand=Order_Details)$filter=OrderID eq‘10643’在$select或$expand表达式中无效”

https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?$expand=Orders($expand=Order_Details)$filter=OrderID eq '10643‘

  1. 无效但返回的结果

详细信息 https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?expand=Territories

  1. 不返回儿童

https://services.odata.org/Experimental/Northwind/Northwind.svc/Products?&expand=Suppliers https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?&expand=Territories

EN

回答 1

Stack Overflow用户

发布于 2020-02-12 11:39:50

https://services.odata.org/Experimental/Northwind不再是“最佳实践”

这是一个大胆的声明,但这个问题证明了许多高级查询功能没有在发布的服务中得到充分或正确的实现。

虽然许多开发人员可能使用它来实践OData查询概念,但考虑到OData实现在很大程度上取决于开发人员及其使用的包的版本,如果您针对要查询的实际服务的活动或开发实现进行查询,则可能具有更大的商业价值。

下面是对OPs查询的分析,以及如何根据OData-V4规范实现所需的响应,并通过使用以下NuGet包的已部署的API进行验证:

  • Microsoft.AspNet.OData v7.3.0
  • Microsoft.OData.Core v7.6.2

我用于测试的实际API是专有的,不能在这里发布。

  1. 根据规范,您必须将$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没有按照5.1.3系统查询选项$expand中定义的那样在扩展中正确地实现$top查询选项 查询选项可应用于扩展的导航属性,方法是在导航属性名称中附加一个以分号分隔的查询选项列表(括在括号中)。允许的系统查询选项有:$filter__、$select__、$orderby__、$skip__、$top__、$count__、$search__和$expand__。

然而,$top在OData v4的ODataLib v7+ (.Net)实现中得到了支持。因此,语法是正确的,但如果使用此语法的查询不起作用,则应向API开发人员查询他们的意见。

注意:当使用$top时,您还应该使用$orderby来确保查询结果是可靠和可复制的:

https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers? $expand=Orders($expand=Order_Details($orderby=ProductID;$top=1))

  1. 若要在扩展中应用多个查询选项,必须使用分号:;分隔.但是,这本身并不会阻止其他客户记录被返回,所以您还必须添加一个根级过滤器,这是一个复杂的事实,因为Orders是一个集合。我们可以使用any函数只返回具有指定Id的订单的客户: 还请注意,OrderID是数字的,所以不要用引号包装比较值。

( $expand=Orders($expand=Order_Details;$filter=OrderID eq 10643) &$ https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers? =https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?/any(o:o/OrderID 10643)

这可以使用参数别名进一步简化:

&$ $expand=Orders($expand=Order_Details;$filter=OrderID = https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers? /any(o:O/orderId @orderId) &@orderId='10643‘

然而:

https://services.odata.org/Experimental/Northwind没有正确地实现https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_ParameterAliases,因此无法验证此服务的别名语法。

也请注意

该实验性服务没有正确地将筛选器应用于根元素或导航集合,但是这里显示的语法与.Net ODataLib实现的OData v4相反。

  1. 您的$expand不能工作的原因是您已经从参数名称中删除了$。OData查询解释器仅标识以$开头的查询选项。另一方面,根据https://services.odata.org/Experimental/Northwind/Northwind.svc/$metadata#Regions,对于$expand没有Order_Details导航属性: 因此,当您用正确的语法再次尝试时: 详细信息 您将得到预期的消息: 无法在“OrderID”类型上找到名为“NorthwindModel.Region”的属性

如果您为$expand查询选项放置了正确的$expandhttps://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?$expand=Territories,则第二次尝试将有效。

OData查询解析器只查找带有$前缀的预期查询选项,这允许您的$逻辑仍然处理您认为合适的其他非OData参数。其他参数仍然是HTTP兼容的参数,odata.org上的实现不知道如何处理它们,它们只是被忽略了。

  1. 这只是在同一个问题上的另一个变化,与3,$是缺失。(我怀疑这个URL应该在3:https://services.odata.org/Experimental/Northwind/Northwind.svc/Products?$expand=Suppliers中)

因此,虽然https://services.odata.org/Experimental/Northwind不是100%可靠的,但.Net ODataLib、SAP或也不是。规范正在发展,目前可能有许多查询技术在任何提供者中都没有完全实现。 只需注意这个事实,当您使用API遇到问题时,第一个接触点应该是支持该特定API的开发人员或社区,这将取决于开发人员使用什么技术和包,以及最终他们在多大程度上支持指定的协议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60076655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档