Ответ 1
Я знаю, что это не решает ваш вопрос так, как вы просили, но, тем не менее, я не считаю, что подкачка должна выполняться так, как вы предлагали. Что я имею в виду, так это то, что, поскольку Azure Table Storage не поддерживает требуемую функциональность, возможно, это не подходит.
Я бы получил данные в локальном кеше, выполнил порядок и пейджинг там и сделаю с ним. Существует рекомендуемое решение для этого ограничения при тщательном построении rowkey/partitionkey, но я бы настоятельно предложил вам не следовать этому.
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 от 10/1/2008 10:00:00 AM будет иметь 2521794455999999999 как RowKey, а b2 от 10/2/2008 10:00:00 AM будет иметь 25217935919999999999 как RowKey, и, следовательно, b2 будет preceede b1.
Чтобы получить все блоги от 10/1/2008 10:00:00 AM, мы будем использовать следующий запрос:
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 г. предоставлено Microsoft)
Что касается подсчета количества страниц, это легко, просто операция разделения будет делать трюк здесь; как и для токенов продолжения, одним из способов было бы (по первому запросу) "пройти" на каждой странице и получить токен продолжения, который в основном просто сообщает вам, какие строки и разделы разделяются дальше. Но все они означают, что вы уязвимы для ошибок согласованности (например, если кто-то что-то помещает в одно хранилище таблиц).
Лично я хотел бы создать страницу на основе rowkeys, как описано выше, или, если это требуется, перейдите к движку хранения, который его поддерживает.
Чтобы подробнее разобраться, если вы знаете, что у вас будет только одно предложение "OrderBy", вы можете выбрать все из них, и с помощью некоторой импликации угадайте, каковы границы страниц.
На стороне примечания, я считаю, что пейджинг предоставлен, чтобы не разрешить пейджинг на интерфейсе, а чтобы обойти предел результата 1000. Но это всего лишь мои 0,02 доллара.