Добавление пользовательского свойства в дочернюю коллекцию OData - PullRequest
0 голосов
/ 13 сентября 2018

Я уже просмотрел эту ссылку:

Добавление пользовательского запроса с поддержкой свойства навигации в ODataConventionModelBuilder

а также эта ссылка:

Добавление пользовательского свойства навигации в OData Web API Controller

Однако ни один из них не помог мне ответить на мой вопрос. Мы создаем конечную точку службы OData, используя ASP.Net Core с Entity Framework Core и библиотеки AspNetCore.OData, которые являются довольно новыми и могут иметь некоторые различия или отсутствие поддержки по сравнению со старыми платформами на момент написания этой статьи.

Я приведу общий пример того, что мы пытаемся сделать, а затем задам конкретный вопрос.

Установка:

  1. У нас есть модель EF Core с объектами «Владелец» и «Автомобиль». Между владельцем и его / ее автомобилями в модели существует отношение один-ко-многим (т. Е. Объект 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 может с этим делать.

...