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

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

Проблема в том, что он возвращает результаты запроса, когда я хочу, чтобы он возвращал объект 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; }
}
1
James Madison 6 Янв 2017 в 20:11

3 ответа

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

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

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

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

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

0
meataxe 27 Июл 2018 в 02:57

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

3
Ihar Yakimush 26 Июл 2018 в 16:20
Это пограничный ответ, содержащий только ссылку. Вам следует расширить свой ответ, включив сюда как можно больше информации, и использовать ссылку только для справки.
 – 
Blue
26 Июл 2018 в 16:28

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

1
ATerry 7 Янв 2017 в 02:33