2012-05-02 11 views
5

Sto creando un'applicazione API Web ASP.NET che restituisce un Atom o un feed RSS. Per fare ciò, crea un System.ServiceModel.Syndication.SyndicationFeed e un utente personalizzato MediaTypeFormatter è responsabile della gestione dell'intestazione HTTP Accept, convertendo lo SyndicationFeed in uno Atom10FeedFormatter o uno Rss20FeedFormatter e lo streaming del risultato nel flusso di risposta. Fin qui tutto bene.Query OData e tipi diversi da IQueryable nell'API Web ASP.NET

mio regolatore di simile a questa:

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

Quello che vorrei fare è utilizzare il built-in OData interrogazione per filtrare mio feed, ma cambiando il tipo di ritorno del metodo Get()-IQueryable<SyndicationFeed> ovviamente non funzionerà poiché un SyndicationFeed non implementa IQueryable.

Esiste un modo per utilizzare l'interrogazione OData integrata nella proprietà IEnumerable<SyndicationItem> su SyndicationFeed?

risposta

3

Lo spazio dei nomi System.Linq fornisce un metodo di estensione denominato AsQueryable all'interfaccia IEnumerable. Il codice sarà lungo le linee di questo:

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

Grazie per il suggerimento, ma che non funziona perché il tipo di ritorno è sbagliato. Nell'esempio, si prevede un IQueryable ma si restituirà un oggetto IEnumerable . SyndicationFeed non implementa IQueryable ma non posso scartarlo perché è la busta per il mio feed RSS o Atom. La domanda è: come ottengo la query OData per filtrare IEnumerable mentre continuo a mantenere SyndicationFeed come tipo di ritorno? –

+0

'return syndicationItems.AsQueryable();' –

3

Questa domanda non è più rilevante, dal momento che Microsoft rimuove il supporto rudimentale per OData interrogazione che era nella build Beta del Web API.

Una versione futura includerà il supporto OData più completo. C'è una versione iniziale di questo disponibile tramite CodePlex e NuGet e ci sono ulteriori dettagli qui: http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

+0

Hai trovato una soluzione per la tua domanda ?? Sto affrontando un problema simile .... controlla la mia domanda e fammi sapere se puoi aiutare in qualsiasi modo http://stackoverflow.com/questions/13451649/how-to-apply-paging-specifically-to-a -list-che-è-parte-di-un-json-using-asp-net – Bitsian

0

Non è necessario restituire IQuerable dal controller quando si lavora con OData. Controllare la sezione "Opzioni query richiamando direttamente" alla https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

Per il vostro caso si presenta come:

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