有没有办法使用LINQ表达式从Silverlight 4中的Netflix oData服务请求Count查询?
http://netflix.cloudapp.net/Catalog/Genres/$count
不是从这样的表达式生成的:
var count = (from g in catalog.Genres select g).Count();
上面的代码返回一个错误,指出不支持Count方法。有没有办法在LINQ中执行此操作,或者我只是需要使WebClient请求获取值?
答案 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中,出现错误。