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.

Il serait utile si vous pouviez joindre la méthode de contrôleur que vous avez écrit pour l'obtention de l'entité.

OriginalL'auteur anaid | 2014-12-18