我在本地开发结构中使用 ASP.NET MVC 和 Azure 表存储。处理大型结果集时,我的分页代码非常慢:
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);
View 使用 ViewData 使用 Sanderson 的 MVC 书中的代码计算分页链接。对于具有 1000 多个实体的 Azure 表,这非常慢。对于初学者来说,“计数”需要相当长的时间来计算实体的总数。如果我正确阅读了我的 LINQ 书,这是因为查询没有实现 ICollection。这本书是 Joseph Rattz 的“Pro LINQ”。
即使我将“numberOfEntities”设置为已知总数(例如 1500),对于 10 以上的页面,分页仍然很慢。我猜 .Skip 和/或 .Take 很慢。另外,我调用了 ExecuteAllWithRetries() 两次,如果实际上 Azure 被查询了两次,那也无济于事。
在使用 ASP.NET MVC 和 Azure 对大型数据集进行分页时,我应该遵循什么策略?
编辑:我不需要知道确切的总页数。