我刚刚开始使用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查询相关记录?
答案 0 :(得分:1)
选项$expand仅通知服务返回导航元素内联以及返回给父实体的请求结果。您应该能够使用您的网址logs
访问/users/1/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
个实体的数组,其中没有您最初请求的产品的供应商数据或属性(尽管在这种情况下,它也包含在列表中)。 / p>