使用 TableContinuationToken 作为书签

本文关键字:书签 TableContinuationToken 使用 | 更新日期: 2023-09-27 18:36:15

从这里获取的这个查询非常简单:

TableContinuationToken token = null;
List<Footwear> shoes = new List<Footwear>();
do
{
  TableQuerySegment<Footwear> queryResult = query.ExecuteSegmented(token);
  token = queryResult.ContinuationToken;
  shoes.AddRange(queryResult.Results);
} while (token != null);

返回 null 后,while 循环结束。是否可以存储最后一个 TableContinuationToken,然后在一段时间后检查在最后一个 TableContinuationToken 之后是否输入了更多鞋类。为了创建"秩序",我使用这种方法。

附注:

我希望以下内容提供更多的背景信息。我目前存储此类的实例:

public class SomeClass : TableEntity
{
    public long Ticks { get; set; }
    public SomeClass(){}
    public SomeClass(string partitionKey)
    {
        PartitionKey = partitionKey;
        Ticks = DateTime.UtcNow.Ticks - DateTime.MinValue.Ticks;
        // rowkey + partition = guid/pk
        // used to order events at the other end - very important  
        RowKey = (DateTime.UtcNow.Ticks - DateTime.MinValue.Ticks).ToString();
    }
}

在 Azure 表存储中。要创建这样的行键,我可以像这样对实体进行排序:

var query =
(from s in _table.CreateQuery<SomeClass>()
where
s.PartitionKey == _partitionKey &&
string.Compare(s.RowKey, rowKeyToUse, StringComparison.Ordinal) > 0 
select s).AsTableQuery(); 

我不时想检查是否有新实体。我认为我不能为此使用rowkey(另请参阅此处)。因此,目前我存储消耗表存储的过程中最后一个实体的最新 Tick。我可以使用此查询来拉取新实体:

 var query =
  (from s in _table.CreateQuery<SomeClass>()
   where
   storedEvent.PartitionKey == _partitionKey &&
   storedEvent.Ticks > _ticks && // only above last threshold
   string.Compare(s.RowKey, rowKeyToUse, StringComparison.Ordinal) > 0 
   select s).AsTableQuery();

所以简而言之 - 这就是我想要实现的目标:

(1) 翻阅所有实体,直到令牌 = null。(2)"拉"表存储。如果有新实体,则循环直到令牌 = null。(3) 重复 (2)

我追求最简单,最强大的方法。目前,我正在使用上述即时报价方法。但是,这感觉是错误的,因为相同的信息已经作为字符串存储在行键中。我希望这是有道理的。

使用 TableContinuationToken 作为书签

如果存储返回的最终实体的分区键和行键,则可以在将来执行 TableQuery 来检查这一点。筛选器应为该实体的分区键 = (如已有)和行键>该实体的行键。然后,您可以使用与已有完全相同的代码。