OData 导航使用 $expand 而不是 url /path
OData navigation use $expand instead of url /path
我刚开始使用 OData 并将其实施到我的 c# Web API 项目中。困扰我的一件事是加载导航 属性 使用 $expand
查询而不是 url /path.
例如,根据rest api规范,如果我们想加载带导航的实体table(parent->child),我们通常调用
/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 中使用这样的解决方案,是否可以使用常见的 parent/child 结构来使用 OData 查询相关记录?
选项 $expand 仅告知服务 return 您的导航元素 内联 以及您对父实体的请求结果。您应该能够使用 url /users/1/logs
访问 logs
实体集,通常它应该 return 一个 log
实体数组,但没有父实体实体属性。但是,如果您希望您的父实体和(扩展的)日志都在一个请求和结果中,则需要使用 $expand 选项。将其视为在获取分层数据集时减少查询数量的一种方法。使用 $expand 您还可以决定要扩展哪些子导航属性(以及扩展到哪个级别)。
使用此 OData v2 测试服务,您可以例如请求一个 Product
实体并使用 $expand 选项不仅扩展供应商,还扩展供应商的所有产品:
服务的 base 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
实体,而没有您最初请求的产品的供应商数据或属性(尽管在这种情况下它也包含在列表中)。
我刚开始使用 OData 并将其实施到我的 c# Web API 项目中。困扰我的一件事是加载导航 属性 使用 $expand
查询而不是 url /path.
例如,根据rest api规范,如果我们想加载带导航的实体table(parent->child),我们通常调用
/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 中使用这样的解决方案,是否可以使用常见的 parent/child 结构来使用 OData 查询相关记录?
选项 $expand 仅告知服务 return 您的导航元素 内联 以及您对父实体的请求结果。您应该能够使用 url /users/1/logs
访问 logs
实体集,通常它应该 return 一个 log
实体数组,但没有父实体实体属性。但是,如果您希望您的父实体和(扩展的)日志都在一个请求和结果中,则需要使用 $expand 选项。将其视为在获取分层数据集时减少查询数量的一种方法。使用 $expand 您还可以决定要扩展哪些子导航属性(以及扩展到哪个级别)。
使用此 OData v2 测试服务,您可以例如请求一个 Product
实体并使用 $expand 选项不仅扩展供应商,还扩展供应商的所有产品:
base 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
实体,而没有您最初请求的产品的供应商数据或属性(尽管在这种情况下它也包含在列表中)。