2015-02-23 74 views
4

我是Azure表存儲新手。我想在表格中得到總行數。獲取Azure錶行數

目前蔭做這樣的事情: -

public List<T> ReadAll(string partitionKey) 
    { 
     List<T> entities = new List<T>(); 

     TableQuery<T> query = new TableQuery<T>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey.ToLower())); 
     entities = Table.ExecuteQuery(query).ToList(); 

     return entities; 
    } 

這目前通過所有的表項讀取。當涉及較少的記錄時,這可以正常工作。但是我擔心記錄何時會增加,這種方法會很乏味。

有沒有其他優雅的方式來做到這一點?

+0

我在用於.NET * GitHub項目的* Microsoft Azure存儲庫上打開此問題:[功能請求:API以獲取CloudTable的計數](https://github.com/Azure/azure-storage-net /問題/ 469)。 – 0xced 2017-06-01 08:54:53

回答

13

不幸的是,沒有其他辦法可以做到這一點。你可能做的一件事就是隻使用查詢投影來獲取少數屬性。這樣做會減少響應負載,從而加快操作的速度。

爲了詳細說明我的答案,截至今天,獲取實體總數的唯一方法是獲取所有實體。上面的代碼爲實體提取所有屬性,這些屬性並不是真正需要的,因爲您只希望獲取實體的數量。這就是爲什麼我說你只能獲取PartitionKey, RowKey, and Timestamp屬性。要僅提取屬性的子集,可以使用query projection並指定要獲取的屬性列表(本例中爲PartitionKey, RowKey, and Timestamp)。要做到這一點,只需修改您的查詢是這樣的:

TableQuery<T> query = new TableQuery<T>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey.ToLower())).Select(new List<string> {"PartitionKey", "RowKey", "Timestamp"}); 
+0

感謝您的回覆。請你詳細說明 – HappyCoder 2015-02-23 06:24:39

+0

更新了我的答案。 HTH。 – 2015-02-23 08:07:27

+0

這應該起作用。謝謝 :) – HappyCoder 2015-02-23 09:15:08

5

看起來就像你在C#中這樣做,但由於這不是在問題中指定,這裏就是我如何在PowerShell中做到了。您需要安裝Azure Powershell

這裏重要的是我告訴它只檢索PartitionKey列,雖然它仍然檢索RowKey,Timestamp和ETag,我無法弄清楚如何關閉它們。如果你根本不覆蓋SelectColumns,或者給它分配一個空數組,它將檢索你不想在這裏的所有表的列。

function GetTable($connectionString, $tableName) 
{ 
    $context = New-AzureStorageContext -ConnectionString $connectionString 
    $azureStorageTable = Get-AzureStorageTable $tableName -Context $context 
    $azureStorageTable 
} 

function GetTableCount($table) 
{ 
    #Create a table query. 
    $query = New-Object Microsoft.WindowsAzure.Storage.Table.TableQuery 

    #Define columns to select. 
    $list = New-Object System.Collections.Generic.List[string] 
    $list.Add("PartitionKey") 

    #Set query details. 
    $query.SelectColumns = $list 

    #Execute the query. 
    $entities = $table.CloudTable.ExecuteQuery($query) 
    ($entities | measure).Count 
} 

$connectionString = "<yourConnectionString>" 
$table = GetTable $connectionString <yourTableName> 
GetTableCount $table 

希望這可以幫助別人!