返回Windows Azure Table查询的1000多个实体

时间:2014-11-16 18:22:37

标签: azure odata azure-table-storage

我的问题正是this one。但是,Azure Storage 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);

2 个答案:

答案 0 :(得分:5)

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

文档仅表示它对纯REST请求有 1,000 限制,ExecuteQuery API在内部使用此rest api,但会自动切换为多个请求,每个请求都有一个限制的 1000

因此,如果您使用.NET软件包,则不必担心此限制,库已经为您处理了此问题。有关详细信息,请参阅此thread

以下是Azure SDK中ExecuteQuery的一些关键代码,如果您没有指定9223372036854775807L号,您会发现实际最大数量为take

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);
}

答案 1 :(得分:1)

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

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

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