odatacontroller example delete create c# asp.net-web-api odata odata-v3

c# - example - Web API OData Inlinecount no funciona



odata v4 example c# (1)

Estoy usando el ValuesController de fábrica en una aplicación ASP.NET Web API

public class ValuesController : ApiController { // GET api/values [Queryable(PageSize = 1)] public IQueryable<string> Get() { return new string[] { "value1", "value2", "value3", "value4", "value5" }.AsQueryable(); } }

Cuando get http://localhost/api/values?$inlinecount=allpages

Esta es la respuesta

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <string>value1</string> </ArrayOfString>

He descomentado config.EnableQuerySupport();

El filtrado y la clasificación funcionan bien.

Si intento get http://localhost/api/values?$inlinecount=XXXXX obtengo una excepción, por lo que parece que la aplicación web API sabe acerca de la inlinecount en inlinecount

<Message>The query specified in the URI is not valid.</Message> <ExceptionMessage>''xxx'' is not a valid value for $inlinecount.</ExceptionMessage> <ExceptionType>Microsoft.Data.OData.ODataException</ExceptionType>

Definitivamente tengo el paquete Microsoft.AspNet.WebApi.OData - aquí está el resultado de la consola de Package Manager

PM> Install-Package Microsoft.AspNet.WebApi.OData Attempting to resolve dependency ''Microsoft.Net.Http (= 2.0.20710.0 && < 2.1)''. Attempting to resolve dependency ''Microsoft.AspNet.WebApi.Client (= 4.0.20710.0 && < 4.1)''. Attempting to resolve dependency ''Newtonsoft.Json (= 4.5.6)''. Attempting to resolve dependency ''Microsoft.AspNet.WebApi.Core (= 4.0.20710.0 && < 4.1)''. Attempting to resolve dependency ''Microsoft.Data.OData (= 5.2.0 && < 5.3.0)''. Attempting to resolve dependency ''System.Spatial (= 5.2.0)''. Attempting to resolve dependency ''Microsoft.Data.Edm (= 5.2.0)''. ''Microsoft.AspNet.WebApi.OData 4.0.0'' already installed. WebServicesProject already has a reference to ''Microsoft.AspNet.WebApi.OData 4.0.0''.

¿Alguna sugerencia?


Gran pregunta

$ inlinecount solo funciona cuando está enviando respuestas OData. La razón de esto es que OData define campos especiales en los datos que XML y JSON no definen. Entonces en OData una respuesta podría verse así:

{ "odata.metadata":"http://localhost:12345/odata/$metadata#Customers", "odata.count":"4", "value":[ ... ] }

Observe el contenedor con la propiedad "odata.count". Esto es diferente de la forma en que los formateadores XML y JSON predeterminados escriben datos porque no tienen envoltorios para esta información adicional. Por lo tanto, otros formateadores no se modifican por defecto.

Ahora tienes varias opciones:

Puede optar por usar el formato OData. Para esto, querrá seguir las instrucciones en esta publicación de blog:

http://blogs.msdn.com/b/webdev/archive/2013/01/29/getting-started-with-asp-net-webapi-odata-in-3-simple-steps.aspx

También puede optar por devolver en cambio una PageResult<T> . Esto se ve así:

public PageResult<Customer> Get(ODataQueryOptions<Customer> queryOptions) { IQueryable results = queryOptions.ApplyTo(_customers.AsQueryable()); return new PageResult<Customer>(results as IEnumerable<Customer>, Request.GetNextPageLink(), Request.GetInlineCount()); }

Esto debería funcionar bien para OData, JSON y XML al agregar un objeto contenedor para XML y JSON que puede incluir el recuento y el enlace de la página siguiente.