将自定义属性添加到OData子集合

时间:2018-09-12 22:09:07

标签: c# asp.net-core odata

我已经查看了此链接:

Adding a custom query backed Navigation Property to ODataConventionModelBuilder

以及此链接:

Adding a custom navigation property to OData Web API Controller

但是,这些都没有真正帮助回答我的问题。 我们正在使用带有实体框架核心的ASP.Net Core和AspNetCore.OData库来构建OData服务端点,它们是相当新的,与撰写本文时的较早框架相比可能有所不同或缺乏支持。

我将提供一个关于我们正在尝试做的一般示例,然后具体询问我的问题。

设置:

  1. 我们有一个设置有“所有者”和“汽车”对象的EF Core模型。模型中的所有者和他/她的Cars之间存在一对多关系(即,Owner对象具有ICollection Cars {get; set;}属性。)这些名称对于示例是任意的,但足够了。

  2. 我们有一个OwnersController:具有标准的ODataController

[EnableQuery]

public SingleResult<Owner> Get(int key) {...}

返回特定所有者的方法。

  1. 出于[可能]与我的问题无关的原因,我们还添加了方法
[EnableQuery]

public IQueryable<Car> GetCars([FromODataUri] int key)
{
    return _context.Owner
        .Include(o => o.Cars)
        .Single(record => record.Id == key)
        .Cars
        .AsQueryable();
}

到OwnerController类,这样一个URL如 “ http://localhost:50548/odata/Owners(123)/Cars”将返回指定所有者的汽车收藏。

这很好用,并且从本质上给了我们想要的结果:

{
    "@odata.context": "http://localhost:50548/odata/$metadata#Car",
    "value": [
        { "OwnerId": 123, "CarId": 2346, ... },
        { "OwnerId": 123, "CarId": 3543, ... },
        ...etc...
    ]
}

问题: 由于其现有含义,我不喜欢使用术语“导航属性”,但是我们想要做的就是向该对象添加一个字符串属性,其中包含集合,该属性表示导航回父所有者数据的路径。集合的元素:

{
    "@odata.context":  "http://localhost:50548/odata/$metadata#Car",
    "parent": "/odata/Owner(123)",  <== ADD THIS ===
    "value": [
        ...
    ]
}

是否可以在ODataConventionModelBuilder中指定某些内容来做到这一点?

我们曾考虑创建某种包装对象,但不想这样做,因为那样一来,我们就失去了IQueryable <>的好处以及OData可以做到这一点。

0 个答案:

没有答案