Compteur des éléments OData v4 WebAPI réponse
Comment retourner le nombre d'éléments dans OData v4 HTTP de la réponse?
J'ai besoin de ce numéro pour la pagination, de sorte qu'il devrait être le nombre d'éléments après filtrage, mais avant de "skip" et "top".
J'ai déjà essayé en passant '$inlinecount=allpages' et '$count=true' paramètres dans les options de requête dans l'url (https://damienbod.wordpress.com/2014/06/13/web-api-and-odata-v4-queries-functions-and-attribute-routing-part-2/ - "Exemple de $count"), mais mes réponses de WebAPI toujours uniquement les résultats de la requête (collection) - ensemble de la réponse ressemble:
[
{
"Name":"name1",
"age":5
},
{
"Name":"name2",
"age":15
}
]
Il n'y a rien comme "odata.le comte" dans la réponse.
J'ai aussi essayé de retourner PageResult au lieu de IQueryable dans mon WebAPI contrôleur de l'action (comme décrit ici: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options#server-paging), mais Demande.GetInlineCount() est obsolète et sa valeur est toujours null.
Des idées?
[Mise à jour] je viens de trouver le même problème ici: WebApi avec Odata NextPage et le Comte ne figurant pas dans la réponse JSON et j'ai enlevé [EnableQuery] attribut et maintenant, ma réponse est:
{
"Items":
[
{
"Name":"name1",
"age":5
},
{
"Name":"name2",
"age":15
}
],
"NextPageLink":null,
"Count":null
}
Mais encore du "Comte" est toujours null. 🙁
Edit: Après le débogage et la recherche pour compter de valeur dans les propriétés de la Demande dans mon contrôleur, j'ai découvert que le nombre correct de la valeur est dans le bien nommé "le Système de.Web.OData.TotalCount". Donc maintenant je exctract cette valeur à partir de la demande de biens et de mon contrôleur ressemble à ça:
public PageResult<People> Get(ODataQueryOptions<People> queryOptions)
{
var query = _context.People.OrderBy(x => x.SomeProperty);
var queryResults = (IQueryable<People>)queryOptions.ApplyTo(query);
long cnt = 0;
if (queryOptions.Count != null)
cnt = long.Parse(Request.Properties["System.Web.OData.TotalCount"].ToString());
return new PageResult<People>(queryResults, null, cnt);
}
Et il fonctionne très bien, mais je ne sais toujours pas pourquoi je dois utiliser des solutions de contournement comme ça.
OriginalL'auteur anaid | 2014-12-18
Vous devez vous connecter pour publier un commentaire.
Pour référence future OData (v4):
Tout d'abord
$inlinecount
il n'est pas pris en charge dansOData v4
de sorte que vous devriez utiliser$count=true
à la place.Deuxièmement, si vous avez un normal
ApiController
et de vous renvoyer à un type commeIQueryable<T>
c'est la façon dont vous pouvez joindre uncount
propriété, le résultat renvoyé:Pour un support complet de OData fonctionnalités que vous devez mettre en œuvre un
ODataController
la manière suivante:Personnescontroller.cs
App_Start \ WebApiConfig.cs
Puis vous accédez à votre OData Api de cette façon (exemple):
uri codé:
décodé:
Références:
OriginalL'auteur CodeArtist
C'est ce que j'utilise avec oData v4:
OriginalL'auteur Maciej
Vous s'il vous plaît prendre un coup d'oeil à l'exemple de service TripPin implémentation d'api web à https://github.com/OData/ODataSamples/blob/master/Scenarios/TripPin. Vous pouvez suivre le code dans les Aéroports, le contrôleur et le service avec le code http://services.odata.org/TripPinWebApiService/Airports?$count=true pouvez retourner le comte correctement.
cnt = long.Parse(Request.Properties["System.Web.OData.TotalCount"].ToString())
(en savoir Plus sur cette solution de contournement est édité mon post ci-dessus)OriginalL'auteur QianLi
Cela peut également être réalisé par une action de filtre:
Et la coutume PageResult classe est:
Utilisation:
OriginalL'auteur Vikrant Verma