4

我正在构建一个返回 Atom 或 RSS 提要的 ASP.NET Web API 应用程序。为此,它构建 aSystem.ServiceModel.Syndication.SyndicationFeed和一个 customMediaTypeFormatter负责处理 HTTP Accept Header,将 转换SyndicationFeed为 anAtom10FeedFormatter或 an Rss20FeedFormatter,并将结果流式传输到响应流。到目前为止,一切都很好。

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

    公共类 FeedController : ApiController
    {
        公共 HttpResponseMessage 获取()
        {
            FeedRepository feedRepository = new FeedRepository();
            HttpResponseMessage<SyndicationFeed> successResponseMessage = new HttpResponseMessage<SyndicationFeed>(feedRepository.GetSyndicationFeed());
            返回成功响应消息;
        }
    }

我想做的是利用内置的 OData 查询来过滤我的提要,但是将Get()方法的返回类型更改为IQueryable<SyndicationFeed>显然不起作用,因为 aSyndicationFeed没有实现IQueryable.

有没有办法在IEnumerable<SyndicationItem>属性上使用内置的 OData 查询SyndicationFeed

4

3 回答 3

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

于 2012-08-16T19:48:01.927 回答
2

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

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();
    }
}
于 2012-05-10T16:24:19.737 回答
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;
}
于 2018-01-29T16:33:06.383 回答