我正在构建一个返回 Atom 或 RSS feed 的 ASP.NET Web API 应用程序。为此,它构建了一个
System.ServiceModel.Syndication.SyndicationFeed
和一个自定义 MediaTypeFormatter
负责处理 HTTP Accept 标头,将 SyndicationFeed
转换为 Atom10FeedFormatter
或 Rss20FeedFormatter
,并将结果流式传输到响应流。到目前为止,一切都很好。
我的控制器看起来像这样:
公共类 FeedController : ApiController { 公共 HttpResponseMessage Get() { FeedRepository feedRepository = new FeedRepository(); HttpResponseMessagesuccessResponseMessage = new HttpResponseMessage (feedRepository.GetSynminationFeed()); 返回成功响应消息; } }
我想做的是利用内置的 OData 查询来过滤我的提要,但是将
Get()
方法的返回类型更改为 IQueryable<SyndicationFeed>
显然是行不通的,因为 SyndicationFeed
没有实现 IQueryable
。
有没有办法在
IEnumerable<SyndicationItem>
上的 SyndicationFeed
属性上使用内置的 OData 查询?
这个问题不再相关,因为 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
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();
}
}
使用 OData 时,您不必从控制器返回
IQueryable<T>
。
检查“直接调用查询选项”部分,网址为 https://learn.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query -选项
对于您的情况,它看起来像:
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;
}