首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OData导航使用$expand而不是url /path

OData导航使用$expand而不是url /path
EN

Stack Overflow用户
提问于 2019-06-12 23:26:14
回答 1查看 644关注 0票数 0

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

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

代码语言:javascript
复制
/users/1/logs

结果

代码语言:javascript
复制
{
"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改用查询参数

代码语言:javascript
复制
/users/1?$expand=logs

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-13 03:58:28

选项$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实体数组,而没有最初请求的产品的供应商数据或属性(尽管在本例中它也包含在列表中)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56565684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档