Пейджинг Azure Storage Table - PullRequest
16 голосов
/ 13 июня 2011

Для реализации простой подкачки в хранилище Azure в относительно простой форме: Подкачка с помощью Windows Azure Table Storage .Это может быть реализовано с помощью функции продолжения токена.

Но.

Это только начало серьезного подкачки.Первая проблема - сортировка .Вы не можете сделать OrderBy в Azure Table.Каково было бы лучшее решение для преодоления этого?Страницы должны быть отсортированы, это факт.

Вторая проблема, когда вы приходите на пейджинг, состоит в том, чтобы узнать количество всего страниц , просто с помощью функции продолжения токена это невозможно.Делать на каждой странице «.Count ()» кажется мне очень неэффективным (поскольку разделы могут быть на нескольких серверах, например).

Третья проблема, связанная со второй, даже вы можете сосчитать, сколькоу вас есть страницы, как «связать» подсчитанные страницы с токенами продолжения?Это самая большая загадка для меня. Как получить продолжение из конкретной строки таблицы?

Я был бы очень рад, если бы было найдено правильное решение.Я должен признать, что у меня также есть один, и я напишу это в одном из ответов ниже.

1 Ответ

11 голосов
/ 13 июня 2011

Я знаю, что это не решит ваш вопрос так, как вы просили, но, тем не менее, я не верю, что пейджинг должен выполняться так, как вы предлагали. Под этим я подразумеваю, что, поскольку хранилище таблиц 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 доллара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...