2012-05-02 13 views
5

Bir Atom veya RSS beslemesi döndüren bir ASP.NET Web API uygulaması yapıyorum. Bunu yapmak için , System.ServiceModel.Syndication.SyndicationFeed ve özel bir MediaTypeFormatter özel bir MediaTypeFormatter, SyndicationFeed bir Atom10FeedFormatter veya bir Rss20FeedFormatter dönüştürmek ve sonuç yanıt akışına akışı için özel bir sorumludur. Çok uzak çok iyi. OData sorguları ve ASP.NET Web API'sinde IQueryable dışındaki türler

Benim denetleyicisi şuna benzer:

 
    public class FeedController : ApiController 
    { 
     public HttpResponseMessage Get() 
     { 
      FeedRepository feedRepository = new FeedRepository(); 
      HttpResponseMessage<SyndicationFeed> successResponseMessage = new HttpResponseMessage<SyndicationFeed>(feedRepository.GetSyndicationFeed()); 
      return successResponseMessage; 
     } 
    } 

Ne yapmak istiyorum faydalanmak yerleşik OData Feed'imi filtrelemek için sorgulama, ancak IQueryable<SyndicationFeed> için Get() yöntemin dönüş türünü değiştirmeyi SyndicationFeedIQueryable uygulanmadığı için açıkçası çalışmayacaktır.

SyndicationFeed'daki IEnumerable<SyndicationItem> özelliğindeki yerleşik OData sorgulamasını kullanmanın bir yolu var mı?

cevap

3

System.Linq ad alanı, IEnumerable arabirimine AsQueryable adlı bir uzantı yöntemi sunar. Kodunuz bu çizgisinde görünecektir: Microsoft Web API Beta yapı oldu OData sorgulama için ilkel destek kaldırmak beri

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(); 
    } 
} 
+0

öneri için teşekkür ama dönüş tipi yanlış olduğu için bu işe yaramaz: o kitabın durum için https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

de Kontrolü "çağırma Sorgu Seçenekleri Doğrudan" bölümü benziyor. Örneğinizde, bir IQueryable bekleniyor, ancak bir IEnumerable döndüreceksin. SyndicationFeed, IQueryable uygulamıyor ancak RSS veya Atom beslemem için zarf olduğu için onu atamam. Soru şu ki, SyndicationFeed'i geri dönüş türüm olarak tutarken IEnumerable 'i filtrelemek için OData sorgusunu nasıl alabilirim? –

+0

'return syndicationItems.AsQueryable();' –

3

Bu soru, artık alakalıdır.

Gelecekteki bir sürüm daha eksiksiz OData desteği içerecektir. CodePlex ve NuGet ile mevcut bir erken inşa var ve burada daha fazla ayrıntı var: http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

+0

Herhangi bir çözüm için bir soru buldunuz mu ?? Ben benzer bir sorunla karşılaşıyorum .... plz sorumu kontrol edin ve herhangi bir şekilde yardımcı olabilir eğer bana bildirin http://stackoverflow.com/questions/13451649/how-to-apply-paging-specifically-to-a -ki -list-olan-parça-bir-json kullanan-asp-net – Bitsian

0

OData ile çalışırken IQuerable'u denetleyiciden geri döndürmek zorunda değilsiniz.

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