ODATAv4 $ expand не работает при выборе явного объекта - PullRequest
0 голосов
/ 23 апреля 2020

Этот первый GET работает отлично:

http://localhost/webservice/odata/MyStuff?$filter=Id eq 2&$expand=History

Возвращает массив MyStuff и History расширяется.

Однако, если я пытаюсь получить MyStuff с указан ключ, свойство навигации по истории не раскрывается.

http://localhost/webservice/odata/MyStuff(2)?$expand=History

У меня уже настроен HttpConfiguration при запуске

             HttpConfiguration
            .Filter()
            .Expand()
            .Select()
            .OrderBy()
            .MaxTop(null)
            .Count();

1 Ответ

1 голос
/ 23 апреля 2020

Есть несколько точек зрения на такие проблемы:

  1. Данные сами по себе
  2. Запрос, используемый для получения данных
  3. Тип ответа метода контроллера который обслуживает данные
  4. 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, обычно достаточно, чтобы обойтись.

...