OData V4技术问询:如何对独立$count值进行求和
解决OData V4中嵌套集合计数求和的问题
嘿,我来帮你搞定这个OData求和的问题!你遇到的语法错误,核心原因是**Jobs@odata.count是响应返回的注解属性,而非实体模型中的可聚合字段**,所以没法直接用它来做聚合计算。我们需要换一种方式,在查询阶段直接计算Jobs的数量并求和。
两种可行方案
方案一:直接从Assets实体查询(推荐,更简洁高效)
既然你的目标是统计指定Location下、无父Asset的所有Assets的Jobs数量总和,不如直接从Assets实体入手,过滤出符合条件的记录后再聚合:
.../odata/Assets/?$filter=ParentAssetId eq null and Location/Id in (9bb29421-5160-4546-b87f-a78c0074f5c5, 8b2a9727-a642-446e-b992-76c6d1584989)&$apply=aggregate(Jobs/$count with sum as Total)&$top=0
关键说明:
$filter:筛选出无父Asset(ParentAssetId eq null)且所属Location是你指定的两个ID的Assets$apply=aggregate(Jobs/$count with sum as Total):对每个符合条件的Asset,计算其Jobs集合的数量,再把所有这些数量求和得到Total$top=0:只返回聚合结果,不需要返回具体的Asset实体数据
预期返回结果:
{ "@odata.context": ".../odata/$metadata#Assets(Total)", "value": [ { "Total": 8 } ] }
方案二:从Locations实体出发,嵌套聚合
如果你坚持要从Locations实体开始查询,可以通过嵌套的$apply先计算每个Asset的Jobs数量,再汇总所有Asset的结果:
.../odata/Locations/?$filter=(Id eq 9bb29421-5160-4546-b87f-a78c0074f5c5 or Id eq 8b2a9727-a642-446e-b992-76c6d1584989)&$apply=expand(Assets($filter=ParentAssetId eq null;$apply=aggregate(Jobs/$count with sum as AssetJobCount)))&$apply=aggregate(Assets/AssetJobCount with sum as Total)&$top=0
关键说明:
- 先通过
expand(Assets(...))展开指定Location下符合条件的Assets,并在Assets层级用aggregate计算每个Asset的Jobs数量(命名为AssetJobCount) - 再在Locations层级用
aggregate把所有Asset的AssetJobCount求和,得到最终的Total
为什么原来的语法不行?
你之前尝试的&$apply=aggregate(Assets/Jobs@odata.count with sum as Total)之所以报错,是因为Jobs@odata.count是OData响应中自动生成的注解字段(用来标记集合的总数量),它并不是实体模型中定义的可查询、可聚合的属性。我们必须用Jobs/$count这种OData标准语法,在查询阶段直接获取集合的计数,才能进行聚合操作。
内容的提问来源于stack exchange,提问作者ThumbGen
相关产品推荐
相关产品推荐

