OData v4通过多个基数属性排序

时间:2019-03-22 12:59:32

标签: asp.net-core odata odata-v4

我有以下网址:

{{hostUrl}}/odata/TasksOData?$select=Id,Name,State,TaskRuns,LastChangedAt,LastChangedBy&$expand=TaskRuns($orderby=RunAt desc;$top=1;$select=Status,RunAt,RunBy)&$top=16&$orderby=TaskRuns/RunBy

我想从TaskRuns(RunBy)按属性订购Tasks。 TaskRuns是一个集合,我只想考虑第一项。

我收到错误消息:"message": "The parent value for a property access of a property 'RunBy' is not a single value. Property access can only be applied to a single value.",

RunBy是一个GUID字段。对于RunAt,它是DateTime字段,也会发生相同的问题。 我在其他情况下进行了测试,似乎问题出在,因为TaskRuns是一个集合。即使花费比预期更长的时间,以下网址也可以正常工作:

{{hostUrl}}/odata/TasksOData?$select=Id,Name,State,TaskRuns,LastChangedAt,LastChangedBy&$expand=TaskRuns($orderby=RunAt desc;$top=1;$select=Status),Script($select=Name)&$top=16&$orderby=Script/Name desc

后端:OData v4,asp核心,v7.1.0

如何实现?谢谢!

1 个答案:

答案 0 :(得分:0)

您快到了,$ select只能用于定义目标数据类的顶级属性,这些属性可以是原始值或复杂类型,但不能是已声明的集合或类的导航属性作为模型中的实体。

此错误表明属性RunBy的类型是实体类型,而不是“单个值”。要返回这些属性,您必须使用$expand

当然,下一个问题将是$orderby子句,出于相同的原因,您将必须在RunBy中指定属性以用于排序顺序,而无需更多有关模型的信息,我将在以下应该解决该问题的网址中使用FIELDNAME,请用您模型中的正确字段替换此FIELDNAME

以下URL应该可以解决问题:

{{hostUrl}}/odata/TasksOData?$select=Id,Name,State,TaskRuns,LastChangedAt,LastChangedBy&$expand=TaskRuns($orderby=RunAt desc;$top=1;$select=Status,RunAt;$expand=RunBy)&$top=16&$orderby=TaskRuns/RunBy/FIELDNAME&$filter=State eq 'Enabled'&$count=true