当LINQ Count()方法不起作用时,从Netflix oData服务返回计数

时间:2010-05-13 15:30:17

标签: linq silverlight-4.0 odata netflix

有没有办法使用LINQ表达式从Silverlight 4中的Netflix oData服务请求Count查询?

The Netflix documentation shows that you can return counts by appending $count to a request for a collection,但是这样的网址:

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

不是从这样的表达式生成的:

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

上面的代码返回一个错误,指出不支持Count方法。有没有办法在LINQ中执行此操作,或者我只是需要使WebClient请求获取值?

2 个答案:

答案 0 :(得分:5)

Silverligth不支持Count和LongCount,因为它们需要同步执行查询。由于Silverlight要求所有网络操作都是异步的,因此这是不可能的。

您可以以编程方式发出HTTP查询而不使用DataServiceContext(或相关类),因为$ count返回数字的文本表示,解析响应并不那么难。

或者你可以使用一些技巧。您可以使用IncludeTotalCount()将$ inlinecount = allpages查询选项添加到查询中,该查询将包括响应中的计数。然后,为了不从服务器下载所有实体,您可以使用Take(0),它将添加$ top = 0,从而返回空结果集。但内联计数仍将包含正确的数字。

您可以访问QueryOperationResponse.TotalCount属性的内联计数。 像这样:

    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);

答案 1 :(得分:1)

使用C#4.0在LinqPad 4中工作

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

Result: 518

在使用C#3.0的LinqPad 2中,出现错误。