获取Azure表行计数

时间:2015-02-23 05:51:08

标签: azure azure-table-storage rowcount

我是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;
    }

目前读取所有表条目。这对于较少的记录来说是可行的。但是我担心记录会增加而且这种方法会很乏味。

还有其他优雅的方法吗?

3 个答案:

答案 0 :(得分:14)

不幸的是,没有其他办法可以做到这一点。您可能做的一件事就是仅使用查询投影获取少量属性。这样做可以减少响应有效负载,从而加快操作速度。

要详细说明我的答案,截至今天,获取实体总数的唯一方法是获取所有实体。上面的代码提取了实际上并不真正需要的实体的所有属性,因为您只对获取实体的数量感兴趣。这就是为什么我说你只获取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"});

答案 1 :(得分:6)

看起来你是用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

希望这有助于某人!

答案 2 :(得分:0)

完整的C#示例(与TableEntity类无关),通过不检索用户定义的字段来使用最小的带宽。

using Microsoft.Azure.Cosmos.Table;
public static async Task<long> GetCountOfEntities()
{
    var storageAccount = CloudStorageAccount.Parse(storageConnectionString);
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient(new TableClientConfiguration());
    CloudTable table = tableClient.GetTableReference(tableName);

    // don't retrieve any user defined fields
    TableQuery tableQuery = new TableQuery().Select(new List<string>() { "ParitionKey" });

    long count = 0;

    TableContinuationToken continuationToken = null;
    do
    {
        var tableQueryResult = await table.ExecuteQuerySegmentedAsync(tableQuery, continuationToken);
        continuationToken = tableQueryResult.ContinuationToken;

        // increment count
        count += tableQueryResult.Results.Count;

        // display progress if required
        Console.Write($" {count}");

    } while (continuationToken != null);

    return count;
}