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

C# OData导航使用$expand而不是url/path,c#,rest,odata,C#,Rest,Odata,我刚开始使用OData并将其实现到我的c#WebAPI项目中。困扰我的一件事是,要加载导航属性,将使用$expand查询而不是url/path 例如,根据RESTAPI规范,如果我们想加载带有导航表(父->子)的实体,我们通常会调用 /users/1/logs 结果 { "Id": 12254, "ApiKey": 104254635, "FirstName": "Joshua", "LastName": "Marcus", "DateStamp": "2019-06-11T06:43:11.

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

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

/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
这有点奇怪,而且像这样查询资源看起来超出了RESTAPI规范。也许有人可以对此发表评论,并提供更多信息,说明为何在OData中使用这种解决方案,以及是否可以使用公共父/子结构来使用OData查询相关记录

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

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

该服务的基本url:(该服务将其url的一部分替换为随机字符串,因此在浏览器中打开基本url后,您将看到该url的稍微修改版本)


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

感谢您的解释!所以基本上RESTAPI应该像往常一样实现,OData只是在已经实现的RESTAPI端点上添加了一些查询操作符。