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

Cra*_*ker 6 linq netflix silverlight-4.0 odata

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

Netflix文档显示您可以通过将$ count附加到集合请求来返回计数,但是这样的URL:

http://netflix.cloudapp.net/Catalog/Genres/$count
Run Code Online (Sandbox Code Playgroud)

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

var count = (from g in catalog.Genres select g).Count();
Run Code Online (Sandbox Code Playgroud)

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

Vit*_*SFT 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);
Run Code Online (Sandbox Code Playgroud)


Nic*_*ray 1

它可以在 LinqPad 4 中使用 C# 4.0 运行

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

Result: 518
Run Code Online (Sandbox Code Playgroud)

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