【问题标题】:OData navigation use $expand instead of url /pathOData 导航使用 $expand 而不是 url /path
【发布时间】:2019-06-13 03:58:27
【问题描述】:

我刚刚开始使用 OData 并将其实现到我的 c# Web API 项目中。困扰我的一件事是,要加载导航属性,使用 $expand 查询而不是 url /path。

例如,通过rest api规范,如果我们要加载带有导航表(父->子)的实体,我们通常会调用

/users/1/logs

结果

{
"Id": 12254,
"ApiKey": 104254635,
"FirstName": "Joshua",
"LastName": "Marcus",
"DateStamp": "2019-06-11T06:43:11.897+03:00",
"TimeZone": "UTC",
"Logs":[
{"Id": 74216060, "Result": true, "DateStamp": "2019-06-11T06:51:17.487+03:00", "ConversionTime": 3,…},
{"Id": 74215748, "Result": false, "DateStamp": "2019-06-11T06:50:11.117+03:00", "ConversionTime": 3,…}
]
}

加载导航属性的 OData 改为使用查询参数

/users/1?$expand=logs

这有点奇怪,并且看起来不符合 Rest API 规范来查询这样的资源。也许有人可以对此发表评论并提供更多信息,说明为什么在 OData 中使用这种解决方案,是否可以使用通用父/子结构来使用 OData 查询相关记录?

【问题讨论】:

    标签: c# rest odata


    【解决方案1】:

    选项$expand 仅告诉服务返回您的导航元素内联 以及您对父实体的请求结果。您应该能够使用您的 url /users/1/logs 访问 logs 实体集,通常它应该返回一个 log 实体数组,但没有父实体属性。但是,如果您希望您的父实体和(扩展的)日志都在一个请求和结果中,则需要使用 $expand 选项。可以将其视为在获取分层数据集时减少查询数量的一种方法。使用 $expand,您还可以决定要扩展哪些子导航属性(以及扩展到哪个级别)。

    使用此 OData v2 测试服务,您可以请求 Product 实体并使用 $expand 选项不仅可以扩展供应商,还可以扩展供应商的所有产品:

    服务的基本 url:https://services.odata.org/V2/(S(readwrite))/OData/OData.svc/(服务将其部分 url 替换为随机字符串,因此在浏览器中打开基本 url 后,您将看到此 url 的略微修改版本)。

    通过Products(0)?$expand=Supplier/Products 的请求,您将获得 ID 为 0 的产品、其供应商与产品内联,以及供应商的所有产品与供应商内联。但是,如果您请求 Products(0)/Supplier/Products,您将只会收到一组 product 实体,而没有您最初请求的产品的供应商数据或属性(尽管在这种情况下它也包含在列表中)。

    【讨论】:

    • 感谢您的解释!所以基本上 Rest API 应该像往常一样实现,OData 只是在已经实现的 Rest API 端点之上添加了一些查询运算符。
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多