Подкачка (в порядке возрастания) с хранением таблицы Azure

Это прекрасно работает для постраничного вывода данных с шагом не более 1000 элементов:

var q1 =
  (from book in table.CreateQuery<DynamicTableEntity>()
   where book.PartitionKey == "TestPartition"
   select book).AsTableQuery();

TableContinuationToken continuationToken = null;
do
{
    var counter = 0;
    var queryResult = q1.ExecuteSegmented(continuationToken);

    foreach (var entity in queryResult)
    {
    Console.WriteLine(entity.Timestamp + " " + ++counter);
    }

    continuationToken = queryResult.ContinuationToken;
    Console.WriteLine("####" + counter);
} while (continuationToken != null);

Что я действительно хотел бы сделать, так это начать с самых старых предметов. Другими словами, страница над элементами, упорядоченными по возрастанию от entity.Timestamp. Этот запрос не работает:

    var q1 =
  (from book in table.CreateQuery<DynamicTableEntity>()
   where book.PartitionKey == "TestPartition"
   select book).OrderBy(x => x.Timestamp).AsTableQuery();

    TableContinuationToken continuationToken = null;
    do
    {
        var counter = 0;
        var queryResult = q1.ExecuteSegmented(continuationToken);

        foreach (var entity in queryResult)
        {
        Console.WriteLine(entity.Timestamp + " " + ++counter);
        }

        continuationToken = queryResult.ContinuationToken;
        Console.WriteLine("####" + counter);
    } while (continuationToken != null);

Как OrderBy не поддерживается. Есть ли что-нибудь, что я могу сделать, чтобы достичь этого? Благодарю.

PS:

Это может помочь. Однако сначала он получает самые новые элементы, а сначала я хочу получить самые старые.

2 ответа

Решение

Эта ссылка и цитируемый технический документ помогли мне решить эту проблему.

Шаг 1:

Используйте тики как rowkey при создании объектов следующим образом:

var rowKey = (DateTime.UtcNow.Ticks - DateTime.MinValue.Ticks).ToString();
var entity = new DynamicTableEntity("TestEventPartition", rowKey);

Чтобы упорядочить объекты по возрастанию во время постраничного извлечения, используйте подход TableContinuationToken, включающий галочки на клавише:

var rowKeyToUse = string.Format("{0:D19}", DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);

var q1 =
  (from entity in table.CreateQuery<DynamicTableEntity>()
   where entity.PartitionKey == "TestPartition"
   && string.Compare(entity.RowKey, rowKeyToUse, StringComparison.Ordinal) > 0
   select entity).AsTableQuery();

TableContinuationToken continuationToken = null;
do
{
    var counter = 0;
    var queryResult = q1.ExecuteSegmented(continuationToken);

    foreach (var entity in queryResult)
    {
    Console.WriteLine("[" + entity.RowKey + "]"
         + ++counter
         );      
    }

    continuationToken = queryResult.ContinuationToken;
    Console.WriteLine("####" + counter);
} while (continuationToken != null);

Надеюсь, это поможет кому-то еще. Любое улучшение предложения / критика приветствуется.

TableQuery не поддерживает порядок по. Вы можете найти поддерживаемые операторы: Поддерживаемые операторы

Другие вопросы по тегам