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 服务

如何从 C# 控制器(OData)的 JSON 序列化中修复丢失的子对象(导航属性)?

如何遍历 oData 中的每个对象?

OData - 在 $expand 中的集合上嵌套 $filter

OData“列表中的 ID”查询

ABAP 中的 OData 服务密码验证