使用TableContinuationToken作为书签

时间:2016-02-25 14:06:34

标签: c# azure-table-storage azure-tablequery

here获取的查询非常简单:

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之后输入了更多Footwear。要创建“订单”,我使用this approach

PS:

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

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表存储中。要创建这样的rowkey,我可以按如下方式对实体进行排序:

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

我不时想检查是否有新的实体。我不认为我可以使用rowkey(参见here)。因此,目前我将最后一个实体的最新Ticks存储在消耗表存储的过程中。我可以使用此查询来获取新实体:

 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)覆盖所有实体,直到token = null。 (2)'拉'表存储。如果有新实体循环,则在token = null之前。 (3)重复(2)

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

1 个答案:

答案 0 :(得分:1)

如果存储了返回的最终实体的分区键和行键,则可以在将来执行TableQuery来检查它。过滤器应该是分区键=到该实体的分区键(就像您已经拥有的那样)和行键&gt;该实体的行键。然后你可以使用你已经拥有的完全相同的代码。