2014-11-16 53 views
2

我的問題恰好是this one。但是,Azure存儲API已更改,我可以找到針對此問題的所有答案都處理舊版本。如何處理當前API版本中返回超過1000個項目的查詢?查詢取不到1000個項目是這樣的:返回超過1000個Windows Azure Table查詢實體

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

回答

5

您是否試圖用上述代碼檢索超過1000個實體?我覺得使用簡單的ExecuteQuery就足夠了。

文檔只說有限制爲純粹的REST要求,ExecuteQuery API內部使用此REST API,可自動切割成多個請求,他們每個人都有的的限制。

所以,如果你使用.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

絕對正確,我不知道爲什麼我認爲它不起作用。一定是我在那裏錯過的東西。謝謝你的好回答! – Marc

1

你的代碼看起來正確的,基本上看起來一樣http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/#retrieve-all-entities - 「如何:檢索分區中的所有實體」

你肯定有該分區中有1000多個實體嗎?您可以通過幾種不同的方式來檢查這一點:

  1. 使用Visual Studio或其他存儲瀏覽器運行相同的查詢並查看您獲得的結果數。
  2. 在運行代碼時使用Fiddler並查看是否有響應中返回的繼續令牌。如果有繼續令牌,那麼你使用的代碼應該自動跟隨它們並創建一個新的請求。如果沒有延續標記,那就意味着沒有更多的實體符合您的查詢。
+0

你鏈接的文章是入門教程,他們可能不會考慮超過1000行的查詢。然而,我已經解決了它,並會發布答案... – Marc

+0

我不知道,我在那裏做了什麼,你絕對是對的!我刪除了我的答案。 – Marc