Я знаю, что это не решит ваш вопрос так, как вы просили, но, тем не менее, я не верю, что пейджинг должен выполняться так, как вы предлагали. Под этим я подразумеваю, что, поскольку хранилище таблиц Azure не поддерживает все функции, которые вам необходимы, оно может не подойти.
Я бы получил данные в локальном кеше, выполнил бы порядок и пейджинг там и покончил бы с этим. Предлагается обходной путь для этого ограничения с тщательным построением ключа строки / раздела, но я настоятельно рекомендую вам не следовать этому.
Blog blog= new Blog();
// Note the fixed length of 19 being used since the max tick value is 19 digits long.
string rowKeyToUse = string.Format("{0:D19}",
DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
blog.RowKey = rowKeyToUse;
Таким образом, в блоге b1 от 01.10.2008 10:00:00 будет указано значение RowKey 2521794455999999999, а в b2 от 02.10.2008 10:00:00 будет указано значение RowKey 2521793591999999999, а следовательно, в b2 предшествовать b1.
Для получения всех блогов, датированных после 01.10.2008 10:00:00, мы будем использовать следующий запрос:
string rowKeyToUse = string.Format("{0:D19}",
DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
var blogs =
from blog in context.CreateQuery<Blog>("Blogs")
where blog.PartitionKey == "Football"
&& blog.RowKey.CompareTo(rowKeyToUse) > 0
select blog;
(взято из таблицы Windows Azure, декабрь 2008 г. Документы предоставлены корпорацией Майкрософт)
Что касается подсчета количества страниц, это просто, просто операция деления поможет вам; Что касается токенов продолжения, одним из способов было бы (по первоначальному запросу) «пройтись» по каждой странице и получить токен продолжения, который в основном просто говорит вам, какие ключи строк и разделов будут следующими. Но наличие их всех означает, что вы уязвимы к ошибкам согласованности (например, если кто-то отправляет что-то в одно и то же хранилище таблиц).
Лично я бы создал страницу на основе строк, как я описал выше, или, если это требовалось, перешел на механизм хранения, который его поддерживает.
Чтобы уточнить немного, если вы знаете, что у вас будет только одно предложение "OrderBy", вы можете выбрать все из них, и через некоторое предположение угадать, какими будут границы страницы.
Кстати, я полагаю, что предоставленный пейджинг предназначен не для того, чтобы пейджинг на внешнем интерфейсе, а для изменения предела 1000 результатов. Но это всего лишь мои 0,02 доллара.