Есть несколько точек зрения на такие проблемы:
- Данные сами по себе
- Запрос, используемый для получения данных
- Тип ответа метода контроллера который обслуживает данные
EnableQueryAttribute
конфигурация
Вы уже продемонстрировали, что данные существуют, поэтому мы можем сделать скидку сами данные , но остальные факторы может быть реализован во всех видах комбинаций.
Вы должны обновить свой вопрос, чтобы показать пример метода вашего контроллера, который обрабатывает GET по ключу запрос
Если вы используете ORM, такой как Entity Framework, то следующий простой контроллер показывает минимальную реализацию, которая должна работать:
[OData.EnableQuery]
public virtual IHttpActionResult Get([FromODataUri] TKey key, ODataQueryOptions<MyStuff> queryOptions)
{
return SingleResultAction(dbContext.MyStuff.Where(x => x.Id == 2));
}
Есть, конечно, много других способов, с минимальной точки зрения, используя SingleResultAction
вынуждает вас передать запрос и подтверждает, что он возвращает только один результат.
Пока результат IQueryable<>
возвращается из вашего метода, EnableQueryAttribute
будет пытаться t o применить queryOptions
к вашему запросу автоматически.
Если ваш набор результатов создан вручную, или NOT возвращен как IQueryable<>
или не может быть автоматически связан, тогда вам придется Применить параметр запроса $expand
вручную.
Вы можете сделать это, чтобы разрешить только расширение для определенных свойств навигации, в следующем примере готовится элемент путем агрессивной загрузки всех записей History
в память
Не рекомендуется, особенно если в вашем свойстве навигации может быть много строк, и пользователь будет расширяться не очень часто, но это работает:
[OData.EnableQuery]
public virtual MyStuff Get([FromODataUri] TKey key, ODataQueryOptions<MyStuff> queryOptions)
{
var item = dbContext.MyStuff.Include(X => x.History).Single(x => x.Id == 2);
return item;
}
В этом примере по-прежнему позволяют EnableQueryAttribute
до $expand
и даже $sort
и $filter
записей в расширении, однако, поскольку все доступные данные были загружены в память, EnableQueryAttribute
не может загрузить дополнительные конечные точки.
в этом последнем примере, хотя элементы History
были загружены в память, сообщение появится только в ответе JSON если опция запроса $expand=History
предоставляется вызывающей стороной.
Есть много других сценариев ios, OP не предоставил код их реализации, так что это все умозрительно отсюда. Я намеренно НЕ продемонстрировал, как вручную Применить QueryOptions к вашему запросу к данным, что вы можете сделать, но пока вы не освоитесь, я призываю вас оставаться ближе к минимальная реализация, мы получаем много OOTB с OData, обычно достаточно, чтобы обойтись.