【问题标题】:OData queries and types other than IQueryable in ASP.NET Web APIASP.NET Web API 中除 IQueryable 之外的 OData 查询和类型
【发布时间】:2018-01-30 00:33:06
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这个问题不再相关,因为 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

    【讨论】:

    • 你有没有为你的问题找到任何解决方案??我面临着类似的问题....请检查我的问题,如果你能以任何方式提供帮助,请告诉我stackoverflow.com/questions/13451649/…
    【解决方案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();
        }
    }
    

    【讨论】:

    • 感谢您的建议,但这不起作用,因为返回类型错误。在您的示例中,它需要一个 IQueryable,但您将返回一个 IEnumerable。 SyndicationFeed 没有实现 IQueryable,但我不能丢弃它,因为它是我的 RSS 或 Atom 提要的信封。问题是,如何让 OData 查询过滤 IEnumerable 同时仍将 SyndicationFeed 作为我的返回类型?
    • return syndicationItems.AsQueryable();
    【解决方案3】:

    使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 2013-08-17
      • 2012-07-26
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多