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请求获取值?
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)
它可以在 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 中会出现错误。