我有以下网址:
{{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
如何实现?谢谢!
答案 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