我建立一个返回Atom或RSS源的ASP.NET Web API应用程序。 要做到这一点,它建立一个System.ServiceModel.Syndication.SyndicationFeed
和定制MediaTypeFormatter
是负责处理HTTP Accept报头,将所述SyndicationFeed
到任何一个Atom10FeedFormatter
或Rss20FeedFormatter
,和流的结果来响应流。 到现在为止还挺好。
我的控制器看起来是这样的:
public class FeedController : ApiController
{
public HttpResponseMessage Get()
{
FeedRepository feedRepository = new FeedRepository();
HttpResponseMessage<SyndicationFeed> successResponseMessage = new HttpResponseMessage<SyndicationFeed>(feedRepository.GetSyndicationFeed());
return successResponseMessage;
}
}
我想这样做是利用内置的OData查询来过滤我的饲料,但改变的返回类型Get()
方法IQueryable<SyndicationFeed>
显然不会因为工作SyndicationFeed
没有实现IQueryable
。
有没有办法使用内置的OData的查询方式IEnumerable<SyndicationItem>
的财产SyndicationFeed
?
这个问题已不再重要,因为微软移除的OData查询的基本支持,这是在网络API的测试版版本。
未来的版本将包括更完整的OData支持。 还有就是这可早期通过建立和CodePlex上和的NuGet这里有更多的细节: http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net织网,api.aspx
该System.Linq的命名空间提供了一个名为扩展方法AsQueryable已到IEnumerable
接口。 您的代码将沿此线看:
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的工作时,从控制器返回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;
}