2010-05-13 26 views
6

Existe-t-il un moyen d'utiliser une expression LINQ pour demander une requête Count à partir du service Netflix oData dans Silverlight 4?Nombre de retours depuis le service oData de Netflix lorsque la méthode LINQ Count() ne fonctionne pas

The Netflix documentation shows that you can return counts by appending $count to a request for a collection, mais une URL comme ceci:

http://netflix.cloudapp.net/Catalog/Genres/$count 

n'est pas généré à partir d'une expression comme ceci:

var count = (from g in catalog.Genres select g).Count(); 

Le code ci-dessus renvoie une erreur indiquant que la méthode de comptage est pas pris en charge. Existe-t-il un moyen de faire cela dans LINQ, ou dois-je juste faire une requête WebClient pour obtenir la valeur?

+0

amour BTW vos podcasts –

Répondre

1

Il travaille dans LINQPad 4 en utilisant C# 4,0

var count = (from g in Genres select g).Count(); 
count.Dump(); 

Result: 518 

En LINQPad 2 en utilisant C# 3.0 l'erreur apparaît.

+0

Je mis à jour le message original, mais j'oublié de mentionner que je fais cela dans Silverlight 4. Il semble que cette approche va à l'encontre d'un DataServiceCollection est pas pris en charge dans Silverlight . –

+0

Merci! - à propos du podcast :) –

+0

En parcourant la source sur http://odata.codeplex.com, il semblerait qu'il devrait supporter .Count() –

5

Count et LongCount ne sont pas pris en charge dans Silverligth car ils nécessitent une exécution synchrone de la requête. Comme Silverlight exige que toutes les opérations réseau soient asynchrones, cela n'est pas possible.

Vous pouvez soit émettre la requête HTTP en question par programmation sans utiliser DataServiceContext (ou des classes associées), puisque le nombre $ renvoie une représentation textuelle du nombre, l'analyse de la réponse n'est pas si difficile.

Ou vous pouvez utiliser un peu d'un tour. Vous pouvez utiliser IncludeTotalCount() pour ajouter l'option de requête $ inlinecount = allpages à la requête qui inclura le nombre dans la réponse. Ensuite, pour ne pas télécharger toutes les entités du serveur, vous pouvez utiliser Take (0) qui ajoutera $ top = 0 et retournera ainsi le jeu de résultats vide. Mais le nombre en ligne contiendra toujours le bon nombre.

Vous pouvez accéder au compte en ligne de la propriété QueryOperationResponse.TotalCount. Quelque chose comme ceci:

NetflixCatalog ctx = new NetflixCatalog(new Uri("http://netflix.cloudapp.net/Catalog")); 
var q = (DataServiceQuery<Genre>)ctx.Genres.IncludeTotalCount().Take(0); 
q.BeginExecute((ar) => 
    { 
     QueryOperationResponse<Genre> r = (QueryOperationResponse<Genre>)q.EndExecute(ar); 
     r.TotalCount.ToString(); // Use the count in whatever way you need 
    }, null);