我正在构建一个返回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查询?
答案 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;
}