【问题标题】:Return more than 1000 entities of a Windows Azure Table query返回 Windows Azure 表查询的 1000 多个实体
【发布时间】:2014-11-16 18:22:37
【问题描述】:

我的问题正是this one。但是,Azure 存储 API 发生了变化,我能找到的关于这个问题的所有答案都是针对旧版本的。如何处理当前 API 版本中返回超过 1000 项的查询?获取少于 1000 个项目的查询如下所示:

var query = new TableQuery<TermScoreEntity>()
            .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal,    Name));

var table = _tableClient.GetTableReference("scores");

foreach (var termScoreEntity in table.ExecuteQuery(query))            
    result.Add(termScoreEntity.RowKey, termScoreEntity.Score);

【问题讨论】:

    标签: azure odata azure-table-storage


    【解决方案1】:

    您是否尝试过使用上述代码检索 1000 多个实体?我认为使用简单的ExecuteQuery 就足够了。

    文档只说它对纯REST请求有1,000限制,ExecuteQuery API内部使用这个rest api,但是自动切到多个请求,每个请求都有的限制>1,000

    因此,如果您使用 .NET 包,则无需担心此限制,该库已经为您处理了这个问题。您可以参考此thread 了解更多信息。

    这里是来自 Azure SDK 的 ExecuteQuery 的一些关键代码,如果你不指定 take 数字,你会发现实际上最大数字是 9223372036854775807L

    internal IEnumerable<DynamicTableEntity> Execute(CloudTableClient client, CloudTable table, TableRequestOptions requestOptions, OperationContext operationContext)
    {
      CommonUtility.AssertNotNullOrEmpty("tableName", table.Name);
      TableRequestOptions modifiedOptions = TableRequestOptions.ApplyDefaults(requestOptions, client);
      operationContext = operationContext ?? new OperationContext();
      return CommonUtility.LazyEnumerable<DynamicTableEntity>((Func<IContinuationToken, ResultSegment<DynamicTableEntity>>) (continuationToken =>
      {
        TableQuerySegment<DynamicTableEntity> local_0 = this.ExecuteQuerySegmented((TableContinuationToken) continuationToken, client, table, modifiedOptions, operationContext);
        return new ResultSegment<DynamicTableEntity>(local_0.Results)
        {
          ContinuationToken = (IContinuationToken) local_0.ContinuationToken
        };
      }), this.takeCount.HasValue ? (long) this.takeCount.Value : long.MaxValue);
    }
    

    【讨论】:

    • 绝对正确,我不知道为什么我认为它不起作用。一定是我在那里错过的东西。谢谢你的好答案!
    【解决方案2】:

    您的代码看起来是正确的,基本上看起来与http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/#retrieve-all-entities 相同 - “如何:检索分区中的所有实体”

    您确定该分区中有超过 1000 个实体吗?您可以通过几种不同的方式进行检查:

    1. 使用 Visual Studio 或其他一些存储资源管理器运行相同的查询并查看您获得了多少结果。
    2. 在运行代码时使用 Fiddler 并查看响应中是否返回了继续令牌。如果有延续令牌,那么您使用的代码应该自动跟随它们并创建一个新请求。如果没有延续标记,则意味着没有更多实体与您的查询匹配。

    【讨论】:

    • 您链接的文章是入门教程,此时他们可能不考虑超过 1000 行的查询。但是,我已经解决了,并将发布答案...
    • 我不知道,我在那里做了什么,你完全正确!!我删除了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多