Я использую 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);
ViewData используется View для вычисления ссылок на страницы с использованием кода из книги Сандерсона MVC. Для таблицы Azure с 1000+ сущностями это очень медленно. Для начала, «Подсчет» занимает довольно много времени, чтобы рассчитать общее количество сущностей. Если я правильно читаю свою книгу LINQ, это потому, что запрос не реализует ICollection. Книга "Pro LINQ" Джозефа Ратца.
Даже если я установлю «numberOfEntities» на известную сумму (например, 1500), подкачка будет медленной для страниц выше 10. Я предполагаю, что .Skip и / или .Take медленные. Кроме того, я дважды вызываю ExecuteAllWithRetries (), и это не поможет, если на самом деле Azure запрашивается дважды.
Какую стратегию следует использовать для разбивки на большие наборы данных в ASP.NET MVC и Azure?
РЕДАКТИРОВАТЬ: мне не нужно знать точное общее количество страниц.