使用 Azure 表存储进行分页(升序排序)

本文关键字:升序 排序 分页 Azure 存储 使用 | 更新日期: 2023-09-27 18:35:42

这适用于以最多 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);

我真正想做的是先从最古老的项目开始。换句话说,按实体升序排列的项目。时间戳。此查询不起作用:

    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);

由于不支持排序方式。我能做些什么来实现这一点吗?谢谢。

附注:

这可能会有所帮助。但是,它首先检索最新的项目,而我想先检索最旧的项目。

使用 Azure 表存储进行分页(升序排序)

TableQuery 不支持 order by。您可以找到支持的运算符:支持的运算符

这个链接和引用的白皮书帮助我解决了这个问题。

第 1 步:

使用刻度作为行键,同时创建实体,如下所示:

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);

希望这对其他人有所帮助。欢迎任何改进建议/批评。