2012-05-02 8 views
5

Estoy creando una aplicación de API web ASP.NET que devuelve un Atom o una fuente RSS. Para hacer esto, construye un System.ServiceModel.Syndication.SyndicationFeed y un MediaTypeFormatter personalizado es responsable de manejar el encabezado HTTP Accept, convirtiendo el SyndicationFeed en o en Rss20FeedFormatter, y transmitiendo el resultado al flujo de respuesta. Hasta aquí todo bien.Consultas y tipos de OData que no sean IQueryable en ASP.NET Web API

Mi controlador es como la siguiente:

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

Lo que me gustaría hacer es hacer uso de la incorporada en el OData consulta para filtrar mi feed, pero cambiando el tipo de retorno del método Get()-IQueryable<SyndicationFeed> obviamente no funcionará ya que SyndicationFeed no implementa IQueryable.

¿Hay alguna manera de utilizar la consulta incorporada de OData en la propiedad IEnumerable<SyndicationItem> en el SyndicationFeed?

Respuesta

3

El espacio de nombres System.Linq proporciona un método de extensión denominado AsQueryable en la interfaz IEnumerable. Su código se vería a lo largo de las líneas de esto:

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

Gracias por la sugerencia, pero que no funciona debido a que el tipo de retorno es erróneo. En su ejemplo, está esperando un IQueryable pero estaría devolviendo un IEnumerable . SyndicationFeed no implementa IQueryable, pero no puedo descartarlo porque es el sobre para mi alimentación RSS o Atom. La pregunta es, ¿cómo obtengo la consulta OData para filtrar el IEnumerable mientras sigo manteniendo el SyndicationFeed como mi tipo de devolución? –

+0

'return syndicationItems.AsQueryable();' –

3

Esta pregunta ya no es relevante, ya que Microsoft retire el soporte rudimentario para OData consulta que estaba en la acumulación de beta de Web API.

Una versión futura incluirá una compatibilidad más completa con OData. Hay una compilación temprana de esto disponible a través de CodePlex y NuGet y hay más detalles aquí: http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx

+0

¿Encontró alguna solución para su pregunta? Me enfrento a un problema similar ... por favor revise mi pregunta y avíseme si puede ayudar de alguna manera http://stackoverflow.com/questions/13451649/how-to-apply-paging-specifically-to-a -list-which-is-part-of-a-json-using-asp-net – Bitsian

0

No tiene que devolver IQuerable del controlador cuando se trabaja con OData. Comprobar la sección "Opciones de consulta invocación directa" en https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

Para su caso se parece a:

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