Вопрос по asp.net-web-api, rest, asp.net, odata – Запросы OData и типы, отличные от IQueryable, в ASP.NET Web API

5

Я создаю приложение ASP.NET Web API, которое возвращает Atom или RSS-канал. Для этого он строитSystem.ServiceModel.Syndication.SyndicationFeed и обычайMediaTypeFormatter отвечает за обработку заголовка HTTP Accept, преобразованиеSyndicationFeed либоAtom10FeedFormatter илиRss20FeedFormatterи потоковую передачу результата в поток ответов. Все идет нормально.

Мой контроллер выглядит примерно так:

    public class FeedController : ApiController
    {
        public HttpResponseMessage Get()
        {
            FeedRepository feedRepository = new FeedRepository();
            HttpResponseMessage<SyndicationFeed> successResponseMessage = new HttpResponseMessage<SyndicationFeed>(feedRepository.GetSyndicationFeed());
            return successResponseMessage;
        }
    }

То, что я хотел бы сделать, это использовать встроенные запросы OData для фильтрации моего канала, но изменив тип возвращаемого значенияGet() метод дляIQueryable<SyndicationFeed> очевидно, не будет работать, так какSyndicationFeed не реализуетIQueryable.

Есть ли способ использовать встроенные запросы OData наIEnumerable<SyndicationItem> собственность наSyndicationFeed?

Ваш Ответ

3   ответа
0

Проверьте & quot; Вызывать параметры запроса напрямую & quot; раздел вhttps://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

Для вашего случая это будет выглядеть так:

public SyndicationFeed Get(ODataQueryOptions<SyndicationItem> opts)
{
    var settings = new ODataValidationSettings();

    opts.Validate(settings);

    SyndicationFeed result = feedRepository.GetSyndicationFeed();

    result.Items = opts.ApplyTo(result.Items.AsQuerable()).ToArray();

    return result;
}
3

AsQueryable кIEnumerable интерфейс. Ваш код будет выглядеть следующим образом:

public class FeedController : ApiController
{
    public IQueryable<SyndicationFeed> Get()
    {
        FeedRepository feedRepository = new FeedRepository();

        //TODO: Make sure your property handles empty/null results:
        return feedRepository.GetSyndicationFeed()
                   .YourEnumerableProperty.AsQueryable();
    }
}
return syndicationItems.AsQueryable();
Спасибо за предложение, но это не сработает, потому что тип возвращаемого значения неправильный. В вашем примере он ожидает IQueryable & lt; SyndicationFeed & gt; но вы бы вернули IEnumerable & lt; SyndicationItem & gt ;. SyndicationFeed не поддерживает IQueryable, но я не могу отказаться от него, потому что это конверт для моего канала RSS или Atom. Вопрос в том, как получить запрос OData для фильтрации IEnumerable & lt; SyndicationItem & gt; все еще сохраняя SyndicationFeed как мой тип возврата? Aidan Black
3

так как Microsoft удаляет элементарную поддержку запросов OData, которая была в бета-версии Web API.

В будущей версии будет более полная поддержка OData. Ранняя сборка доступна через CodePlex и NuGet, и здесь есть более подробная информация:http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

Вы нашли какое-либо решение для вашего вопроса? Я сталкиваюсь с подобной проблемой .... пожалуйста, проверьте мой вопрос и дайте мне знать, если вы можете помочь в любом случаеstackoverflow.com/questions/13451649/…

Похожие вопросы