implémentation de oData inlinecount en utilisant asp.net webapi

Dupliquer possible:
Pagination OData avec WebApi ($ inlinecount)

Comme Asp.net WebAPi est presque compatible avec odata, il est très intéressant pour moi d’obtenir $ inlinecount au travail pour qu’il fonctionne bien avec kendo ui (ou tout autre). Pour qu’il retourne une valeur au format jsonp, j’ai implémenté un nouveau MediaFormatter (de Stackoverflow).

Le problème, c’est qu’il faut que les résultats contiennent l’élément count pour que la pagination côté serveur fonctionne. Pour l’instant, j’ai piraté le formateur pour obtenir un faux compte. Tout cela fonctionne très bien et la grid est heureuse, mais obtenir le nombre réel est un défi, car l’expression IQueryable renvoyée a déjà des filtres / prendre, etc. appliqués.

public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext) { ssortingng callback; if (IsJsonpCountableRequest(out callback)) { return Task.Factory.StartNew(() => { var q = value as IQueryable; var count = q.Count(); // this count doesnt return the actual count var writer = new StreamWriter(stream); writer.Write(callback + "({"); writer.Write(@"""d"""); writer.Write(" : { "); writer.Write(@"""results"""); writer.Write(" : "); writer.Flush(); base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext).Wait(); writer.Write(","); writer.Write(@"""__count"""); writer.Write(" : "); writer.Write(ssortingng.Format(@"""{0}""", count)); writer.Write("}"); writer.Write("})"); writer.Flush(); }); } else { return base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext); } } 

Existe-t-il un moyen d’obtenir le nombre séparément, peut-être auprès du fournisseur sous-jacent d’IQueryable?

Essayez cette approche: http://www.strathweb.com/2012/08/supporting-odata-inlinecount-with-the-new-web-api-odata-preview-package/

Il utilise le dernier package OData de la Web API.

J’ai eu le problème exact la semaine dernière. Découvrez l’ extension de vos réponses à l’API Web ASP.NET avec des métadonnées utiles.

J’ai utilisé ce post et un exemple de code pour mettre en place une grid de pagination avec OData. Comme indiqué dans l’exemple, j’ai créé un gestionnaire de délégation pour capturer le HttpResponseMessage et l’envelopper dans des métadonnées personnalisées comprenant un nombre d’éléments. Un atsortingbut personnalisé, CustomQueryableAtsortingbute, est également créé et hérite de l’atsortingbut QueryableAtsortingbute par défaut.

Cela peut sembler un peu complexe ici mais est en fait assez simple à mettre en œuvre. J’avais quelque chose en marche en 30 minutes environ.

Espérons que les futures versions de l’API Web auront un support OData plus complet.

EDIT: Le support d’Odata NE SERA PAS fourni avec l’API Web. L’atsortingbut interrogeable est en cours de suppression pour la version RTM. Une prise en charge OData plus complète sera disponible quelque temps après la première relance via un package Nuget séparé.

Le SPA DataController (dérivé de ApiController ) utilisé pour implémenter cette fonctionnalité. Cependant, avec les dernières modifications, il a été supprimé, car ils prévoient de prendre en charge OData de manière différente.

Si vous travaillez avec la version bêta de MVC 4, vous pouvez simplement remplacer votre contrôleur par un DataController et le tour est DataController . Si vous utilisez le RC, vous devriez jeter un coup d’œil à un ancien commit Webstack ASP.NET sur Codeplex. La méthode qui vous intéresse est ExecuteAsync , à partir de DataController.cs.