我使用OData v3.0通过Rest API从后端服务器查询数据。
我有一个表(和相关的资源URL(Contact
,每个联系人都有CompanyName
或PersonName
。然而在前端却只显示了一个Name
。
我想实现的是$orderby
这两个字段,以可用的为准。一种可能的方法是连接这两个字段,例如$orderby=concat(CompanyName,PersonName)
,但我得到了这个错误
请检查您的OData查询:对于非基元集合,仅支持按根级别的属性排序。不支持嵌套的属性和表达式。
我还有其他方法可以完成订单吗?谢谢
问题
如何通过一个字段或另一个字段进行订购?
假设答案
您可以在orderby中使用表达式,正如您所做的那样,这里有一个工作示例:
https://services.odata.org/V3/Northwind/Northwind.svc/Customers/?$orderby=concat(电话、传真(
但为什么它不起作用
根据ODATA规范,这应该是可行的,但事实是,大多数后端实现并不完全符合规范。这是很正常的事情。
我知道的许多后端实现都不支持orderby中的嵌套属性或表达式。
尤其是当后端由基于关系数据库的系统(旧的SAP系统、NAV或AX系统(提供时,他们往往不支持它,主要是因为他们想直接将查询推送到数据库,或者直到今天都没有实现它。
您永远不能假设后端完全实现了整个ODATA规范,大多数时候,后端只实现了迄今为止所需的内容。
因此,实际答案
这不是ODATA规范问题。你的方法是正确的。相反,您有一个未完全实现的后端。您唯一的解决方案是要求他们实现它,或者在客户端处理它。
顺便说一下
ODATA v3是一个非常奇怪且很少受支持的ODATA版本。通常,现在有ODataV2或ODataV4。