Я уже просмотрел эту ссылку:
Добавление пользовательского запроса с поддержкой свойства навигации в ODataConventionModelBuilder
а также эта ссылка:
Добавление пользовательского свойства навигации в OData Web API Controller
Однако ни один из них не помог мне ответить на мой вопрос.
Мы создаем конечную точку службы OData, используя ASP.Net Core с Entity Framework Core и библиотеки AspNetCore.OData, которые являются довольно новыми и могут иметь некоторые различия или отсутствие поддержки по сравнению со старыми платформами на момент написания этой статьи.
Я приведу общий пример того, что мы пытаемся сделать, а затем задам конкретный вопрос.
Установка:
У нас есть модель EF Core с объектами «Владелец» и «Автомобиль». Между владельцем и его / ее автомобилями в модели существует отношение один-ко-многим (т. Е. Объект Owner имеет свойство ICollection Cars {get; set;}.) Эти имена для примера произвольны, но их будет достаточно.
У нас есть OwnersController: ODataController со стандартным
[EnableQuery]
public SingleResult<Owner> Get(int key) {...}
метод для возврата конкретного владельца.
- По причинам [возможно], не относящимся к моему вопросу, мы также добавили метод
[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 может с этим делать.