Jer*_*her 7 odata asp.net-web-api
情况
我正在尝试将"Item"扩展到三个级别:
Item.Product.Model.Type
所以我称之为嵌套查询选项url:
http:// xxx/api/Items?$ expand = Product($ expand = Model($ expand = Type))
我收到一条警告,表示已达到最大深度2,因此我将建议的MaxExpansionDepth属性设置为3.但是,不会返回"Type"属性!这个SO问题涵盖了这一点
然后我看看官方的OData V4标准,它说我应该在扩展选项中使用斜杠,如下所示:
http:// xxx/api/Items?$ expand =产品/型号/类型
但这给了我一个错误告诉:
URI中指定的查询无效.找到遍历多个导航属性的路径.请重新调整查询,使每个展开路径仅包含类型段和导航属性.
这个答案涵盖了哪些,但答案与官方OData文档相矛盾.无论如何,这甚至意味着什么.
这个问题
使用OData v4和Web API 2.2的深层次的$ expand查询选项的官方,标准和工作方式是什么
在与聊天中的Jerther合作之后,我们将问题缩小到未标记为包含导航的扩展属性.因此,OData框架正在删除它们,因为它们没有定义相应的实体集.更新模型以专门声明包含似乎已解决了问题.
可以通过多种方式指定包含,具体取决于所使用的模型构建器.在的情况下ODataConventionModelBuilder
,您可以添加System.Web.OData.Builder.ContainedAttribute
有关的财产,而对于ODataModelBuilder
可以使用ContainsMany<T>
方法的EntityTypeConfiguration
实例包含类.
此外,目前,级联展开将停止复杂类型包含实体类型的位置.
更新:
在EntitySet中定义链中的所有类型.
builder.EntitySet<Item>("Items");
builder.EntitySet<Product>("Products");
builder.EntitySet<Model>("Models");
builder.EntitySet<Type>("Types");
Run Code Online (Sandbox Code Playgroud)
似乎将它们定义为EntityType
不够.
见这里:https://github.com/OData/WebApi/issues/226
原始答案
我试过责备你的情况而不能.您的行动中是否可能没有设置"类型"?这是我的小家伙
public class ItemsController : ODataController
{
[HttpGet]
[EnableQuery(MaxExpansionDepth = 10)]
[ODataRoute("/Items")]
public IHttpActionResult GetItems()
{
return this.Ok(CreateItem());
}
private Item CreateItem()
{
return new Item
{
Id = 1,
Products = new Product[]
{
new Product
{
Id = 2,
Models = new Model[]
{
new Model
{
Id = 3,
Types = new MyType[]
{
new MyType
{
Id = 4,
},
},
},
},
},
},
};
}
}
Run Code Online (Sandbox Code Playgroud)
当使用/ Items?$ expand = Products($ expand = Models($ expand = Types))调用时,会产生以下结果:
{
"@odata.context": "http://localhost:9001/$metadata#Items/$entity",
"Id": 1,
"Products@odata.context": "http://localhost:9001/$metadata#Items(1)/Products",
"Products": [{
"Id": 2,
"Models@odata.context": "http://localhost:9001/$metadata#Items(1)/Products(2)/Models",
"Models": [{
"Id": 3,
"Types@odata.context": "http://localhost:9001/$metadata#Items(1)/Products(2)/Models(3)/Types",
"Types": [{
"Id": 4
}]
}]
}]
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8359 次 |
最近记录: |