ローカル開発ファブリックで ASP.NET MVC と Azure Table Storage を使用しています。大きな結果セットを操作すると、ページネーション コードが非常に遅くなります。
var PageSize = 25;
var qResult2 = from c in svc.CreateQuery<SampleEntity>(sampleTableName)
where c.PartitionKey == "samplestring"
select c;
TableStorageDataServiceQuery<SampleEntity> tableStorageQuery =
new TableStorageDataServiceQuery<SampleEntity>
(qResult2 as DataServiceQuery<SampleEntity>);
var result = tableStorageQuery.ExecuteAllWithRetries()
.Skip((page - 1) * PageSize)
.Take(PageSize);
var numberOfEntities = tableStorageQuery.ExecuteAllWithRetries().Count
ViewData["TotalPages"] = (int)Math.Ceiling((double) numberOfEntities / PageSize);
ViewData["CurrentPage"] = page;
return View(result);
ViewData は、Sanderson の MVC ブックのコードを使用してページング リンクを計算するために View によって使用されます。1000 以上のエンティティを持つ Azure テーブルの場合、これは非常に遅くなります。まず、「Count」はエンティティの総数を計算するのにかなりの時間がかかります。LINQ ブックを正しく読んでいる場合、これはクエリが ICollection を実装していないためです。その本は、ジョセフ・ラッツによる「Pro LINQ」です。
"numberOfEntities" を既知の合計 (たとえば 1500) に設定しても、ページングは 10 を超えるページではまだ遅いです。.Skip や .Take が遅いと推測しています。また、私は ExecuteAllWithRetries() を 2 回呼び出しますが、実際に Azure が 2 回クエリされた場合、それは役に立ちません。
ASP.NET MVC と Azure を使用して大規模なデータセットをページングするには、どのような戦略に従う必要がありますか?
編集: 正確な総ページ数を知る必要はありません。