6

LINQ式を使用してSilverlight4のNetflixoDataサービスからCountクエリを要求する方法はありますか?

Netflixのドキュメントには、コレクションのリクエストに$ countを追加することでカウントを返すことができることが示されていますが、URLは次のようになります。

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

次のような式からは生成されません。

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

上記のコードは、Countメソッドがサポートされていないことを示すエラーを返します。LINQでこれを行う方法はありますか、それとも値を取得するためにWebClientリクエストを行う必要がありますか?

4

2 に答える 2

5

Count と LongCount は、クエリの同期実行を必要とするため、Silverligth ではサポートされていません。Silverlight ではすべてのネットワーク操作を非同期にする必要があるため、これは不可能です。

$count は数値のテキスト表現を返すため、応答の解析はそれほど難しくありません。

または、ちょっとしたトリックを使用することもできます。IncludeTotalCount() を使用して、応答にカウントを含めるクエリに $inlinecount=allpages クエリ オプションを追加できます。次に、サーバーからすべてのエンティティをダウンロードしないようにするには、 $top=0 を追加して空の結果セットを返す Take(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);
于 2010-06-11T14:34:52.560 に答える
1

C# 4.0 を使用して LinqPad 4 で動作します

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

Result: 518

C# 3.0 を使用する LinqPad 2 では、エラーが表示されます。

于 2010-05-13T17:14:42.677 に答える