用于唯一分区键的Azure表存储查询

时间:2017-05-02 22:34:40

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

我的问题如下,我有一个Azure Table Storage,设置如下:

  • 分区键:字符串
  • 行键:数字

我想进行一个查询,给定一个数字X,我想为每个分区键返回小于X的最高编号行键。这有点令人困惑,所以这里有一个例子:

分区键,行键

“你好”,7

“你好”,9

“你好”,12

“其他”,6

如果我用数字10查询,我想返回一个像[(“hello”,9),(“other”,6)]这样的列表。请注意,我只需要唯一的分区键和最小的小于10的数字。

我可以用特定的名字来做这件事(为了简洁而留下一些东西):

    string orderFilter = TableQuery.GenerateFilterConditionForLong("RowKey", "le", 10);
    string nameFilter = TableQuery.GenerateFilterCondition("PartitionKey", "eq", "hello");

    TableQuery query = new TableQuery().Where(TableQuery.CombineFilters(orderFilter, "and", nameFilter));

    IEnumerable<NameEntity> names = await nameTable.ExecuteQuerySegmentedAsync<NameEntity>(query, entityResolver, continuationToken);

    // Get newest name
    NameEntity newestName = names.Last();

但我似乎无法弄清楚如何使用所有不同的分区键执行此操作。这可能在一个查询中吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

无法枚举分区键(不进行表扫描),因此您可以:

  • 进行全表扫描,跟踪您沿途找到的各种分区键以及最高值的行键
  • 在将分区密钥写入表存储时跟踪它们(例如,仅使用分区密钥创建另一个表)。

对于后者,另一个答案建议同时写入该分区键的最大值。当然可行。但是你需要记住你需要维护这些元数据。

答案 1 :(得分:1)

非常确定你不能这样做 - Azure表只是没有设置为做这类事情的AFAIK。另一种解决方案是使用基于数字的分区键创建第二个表,并为每个分区的每个最大值创建一行(换句话说,急切地计算它),或类似的东西。