С# OData4 Применить запрос OData без возврата контроллера Queryable

В настоящее время у меня есть C# WebAPI, который использует версию OData, которую мы написали. Мы хотим начать использовать Microsoft OData4, который может больше, чем наша собственная реализация.

Создание контроллера, расширяющего ODataController Я могу создать контроллер, который автоматически выполняет запросы на основе строки запроса. (Показано ниже)

Проблема в том, что он возвращает результаты запроса, когда я хочу, чтобы он возвращал объект Result, который включает дополнительные данные. Когда я устанавливаю тип возвращаемого значения Result, он больше не будет применять строку запроса.

Как я могу использовать автоматическую реализацию запросов и при этом возвращать свой собственный объект? Я попытался создать общедоступный метод, который возвращает правильный объект и вызывает частный метод, возвращающий запрашиваемый объект, но он неправильно фильтрует запрашиваемый объект.

Я на правильном пути или есть другие варианты?

public class CallController : ODataController
{
    [EnableQuery]
    public IQueryable<Call> GetCall()
    {
        var list = new List<Call>
        {
            new Call
            {
                Id = 4
            },
            new Call
            {
                Id = 9
            },
            new Call
            {
                Id = 1
            }
        };
        return list.AsQueryable();
    }
}

public class Call
{
    public int Id { get; set; }
}

public class Result
{
     public Call[] Calls { get; set; }
     public string NewToken { get; set; }
     public string Warning { get; set; }
}

person James Madison    schedule 06.01.2017    source источник


Ответы (3)


Вам нужно будет перехватить ответ с атрибутом фильтра действий в onactionexecuted и преобразовать значение в то, что вы хотите. Это было бы некрасиво, поскольку было бы неясно, что на самом деле возвращает метод. Но я не вижу другого варианта с odata, так как результат должен быть доступным.

person ATerry    schedule 06.01.2017

Используйте ODataQuertOptions вместо атрибута [EnableQuery]. Проверьте https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options#invoking-параметрызапроса-непосредственно

person Ihar Yakimush    schedule 26.07.2018
comment
Это пограничный ответ только по ссылке. Вы должны расширить свой ответ, чтобы включить здесь как можно больше информации, и использовать ссылку только для справки. - person Goodbye StackExchange; 26.07.2018

Под капотом атрибут EnableQuery выполняет действие, которое он украшает, чтобы получить IQueryable<T>, преобразовывая запрос odata во что-то, что можно применить к IQueryable<T>, применяя его и возвращая результаты.

Для работы ему нужен IQueryable<T>.

Пример ODataQueryOptions и в ответе Ихара может дать вам то, что вы хотите, но по разным причинам он был не так полезен для меня, как EnableQuery, и поэтому я остановился на средстве форматирования вывода.

Вы можете проверить первые средства форматирования вывода в services.AddMvc(options => { options.OutputFormatters } в Startup.ConfigureServices и увидеть, что у первого есть куча разных типов полезной нагрузки.

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

person meataxe    schedule 26.07.2018