我刚刚开始使用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查询相关记录?
发布于 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
实体数组,而没有最初请求的产品的供应商数据或属性(尽管在本例中它也包含在列表中)。
https://stackoverflow.com/questions/56565684
复制相似问题