ASP.NET Web API中除IQueryable之外的OData查询和类型

时间:2012-05-02 22:14:45

标签: asp.net rest asp.net-web-api odata

我正在构建一个返回Atom或RSS提要的ASP.NET Web API应用程序。为此,它构建System.ServiceModel.Syndication.SyndicationFeed,自定义MediaTypeFormatter负责处理HTTP Accept Header,将SyndicationFeed转换为Atom10FeedFormatter或{{1} },并将结果流式传输到响应流。到目前为止,非常好。

我的控制器看起来像这样:

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

我想要做的是使用内置的OData查询来过滤我的Feed,但将Rss20FeedFormatter方法的返回类型更改为Get()显然不起作用,因为{ {1}}未实施IQueryable<SyndicationFeed>

有没有办法在SyndicationFeed的{​​{1}}属性上使用内置的OData查询?

3 个答案:

答案 0 :(得分:3)

此问题已不再适用,因为Microsoft删除了对Web API Beta版本中OData查询的基本支持。

未来版本将包括更完整的OData支持。可通过CodePlex和NuGet进行早期构建,此处有更多详细信息:http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

答案 1 :(得分:2)

System.Linq命名空间为IEnumerable接口提供名为AsQueryable 的扩展方法。您的代码将如下所示:

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();
    }
}

答案 2 :(得分:0)

使用OData时,您不必从控制器返回IQuerable。 选中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;
}