【问题标题】:Use TableContinuationToken as bookmark使用 TableContinuationToken 作为书签
【发布时间】:2016-06-08 08:39:34
【问题描述】:

这个来自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 之后检查是否有更多的鞋类输入。要创建“订单”,我使用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 表存储中。要创建这样的行键,我可以像这样对实体进行排序:

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

我不时想检查是否有新实体。我认为我不能为此使用行键(另请参阅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 方法。但是,这感觉不对,因为相同的信息已经作为字符串存储在行键中。我希望这是有道理的。

【问题讨论】:

  • 简单的答案就是“是”...那么您尝试了哪些无效的方法以及发生了什么?
  • 怎么样?在上面的第一个循环完成后,令牌将为空。我想稍后检查在令牌/检查点之后插入的行。
  • 啊,我明白了。让我发布一个答案。

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


【解决方案1】:

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

【讨论】:

  • 谢谢。如果'主键'(分区+行键)没有排序会发生什么?在 sql 中,如果 pk 是 identity(1, 1) 并且 5 是检索到的最后一行的 pk,我可以只说哪里 pk > 5。目前我只使用一个包含“ticks”(时间)的列,这意味着我可以简单地做 where ticks > lastticks
  • 不确定我是否完全理解了。我阅读了您链接到的两件事,但我想我错过了您正在使用它们的哪些部分,因为它们都是较大的文档。我的印象是您的行键是创建实体时的,而分区键是您已经查询的(没有查询代码,所以我不知道)。我认为,如果您使用您正在做的事情而不是链接来更新您的问题,这将有助于我们更好地回答。
  • 道歉。我为我的问题添加了更多上下文 - 请参阅 PS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2023-01-28
  • 2013-05-17
  • 1970-01-01
  • 2020-12-27
  • 2016-02-07
  • 1970-01-01
相关资源
最近更新 更多