【发布时间】:2019-12-17 09:01:59
【问题描述】:
我有一个具有一对多关系的 oData 模型,例如 person->addresses 和 person->driving-licences。我希望能够根据地址实体和驾驶执照实体中的属性对结果集进行排序。由于可能有多个地址,我最初会根据名为IsPrimary 的属性从地址集中选择一个项目。由于可能有多个驾驶执照,我会选择“英国”驾驶执照。这可能吗?
我希望我可以这样做:
/people?$expand=addresses($filter=isPrimary eq true),drivinglicences($filter=country eq 'UK')&$orderby=addresses/postcode,drivinglicences/active
不幸的是,我收到以下错误:
“在 URI 中指定的查询无效。属性 'isPrimary' 的属性访问的父值不是单个值。属性访问只能应用于单个值。”
有谁知道规范是否支持我尝试做的事情?还是我的查询有问题?或者是否是 .NET 库的问题。
我正在使用: Microsoft.AspNet.OData - 7.2.3
非常感谢。
【问题讨论】:
-
您愿意对 API 进行更改吗?正如stackoverflow.com/a/55324393/1690217 中所讨论的,规范中不支持此功能,您可以过滤单例导航属性,但不能过滤集合
-
请用一两个您想过滤的其他关系或字段示例更新您的问题,这样我可以确保我的建议解决方案可行
-
感谢您的回复。我已经用额外的关系更新了帖子。希望这能传达我正在尝试做的事情。我愿意对 API 进行更改。当您说规范中不支持它时-您对此有参考吗?我在规范中找不到任何明确的内容。 :)
-
我已经发布了一个答案,尽管它并没有比以前的解决方案更有帮助。归根结底,要实现这些类型的排序,您将必须实现一个自定义端点,这是一半的乐趣。尽管 OData 允许非常彻底的查询语法,但并不期望每个 OData 查询都只使用 CRUD 端点,有时查询会比结果集本身更多的字节数。尝试实现自定义端点,或修改您的客户端,以便在客户端而不是服务器上完成排序......这当然意味着您应该有一个好的过滤器。