Odata中的子选择
Posted
技术标签:
【中文标题】Odata中的子选择【英文标题】:Sub Select in Odata 【发布时间】:2015-07-21 14:39:43 【问题描述】:我正在寻找一种使用 Odata 创建子选择/子查询的方法。我要创建的查询应如下所示:
SELECT *
FROM Treatment
WHERE status = 'Pos'
and ID IN (
SELECT FIRST(ID)
FROM Treatment
WHERE TreatmentTypeSK = 9
GROUP BY Person, TreatmentTypeSK
ORDER BY Date DESC
)
作为我想要完成的示例,请查看以下数据。
ID Person TreatmentTypeSK Status Date
----------------------------------------------------
1 Bob 9 Pos 1/5/15
2 Bob 9 Neg 2/10/15
3 Jane 9 Pos 1/20/15
4 Jane 9 Neg 1/1/15
5 Jane 8 Pos 3/2/15
使用上面的查询(我希望使用 odata 生成),唯一会返回的结果是 ID 3,因为它是 Jane 的最新处理记录,TreatmentTypeSK 为 9,状态为“Pos”。请注意,不会返回 ID 2,因为即使 Bob 有几条 TreatmentTypeSK 9 的记录,最新的一条没有“Pos”状态。
【问题讨论】:
【参考方案1】:像这样的子查询不适用于 Odata,您必须进行 2 次查询,但我认为您有更大的问题,因为我认为子查询本身是不可能的。
我认为虽然在 OData 规范中使用此链接中提到的 group by 在技术上可能实现这一点:http://docs.oasis-open.org/odata/odata-data-aggregation-ext/v4.0/cs01/odata-data-aggregation-ext-v4.0-cs01.html#_Toc378326290
我认为大多数库都不支持此功能,因此您可能难以实际使用它。我在 TripPin 上试了一下,还是不行……
我可能会将这个功能公开为一个 odata 函数,或者(有点混乱),将查询更改为不按部分分组 - 这也将消除对子查询的需要。问题是你可以每人获得多行,但你可以在客户端上发布处理。
【讨论】:
谢谢汤姆。我见过你提到的 $orderby 功能。然而,这还不是最大的担忧。我真的在寻找有关上面查询中显示的子查询的一些指导。 对不起,我没有把自己说清楚,我已经编辑了答案,希望能更清楚一点。以上是关于Odata中的子选择的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C# 控制器(OData)的 JSON 序列化中修复丢失的子对象(导航属性)?