获取 Azure table 行数

Get the Azure table Row count

我是 Azure table 存储的新手。我想获得 table.

中的总行数

目前我正在做这样的事情:-

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

这当前会通读所有 table 条目。当涉及到较少的记录时,这可以正常工作。但是我担心什么时候记录会增加,这种方法会很乏味。

还有其他优雅的方法吗?

遗憾的是,没有其他方法可以做到这一点。您可能做的一件事是仅使用查询投影仅获取少数属性。这将做的是减少响应有效负载,从而稍微加快操作速度。

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

看起来你是在 C# 中做的,但由于问题中没有指定,下面是我在 Powershell 中的做法。您需要安装 Azure Powershell

这里重要的是我告诉它只检索 PartitionKey 列,虽然它仍然检索 RowKey、Timestamp 和 ETag,但我不知道如何关闭它们。如果您根本不重写 SelectColumns,或为其分配一个空数组,它将检索您的所有 table 列,这是您在这里不需要的。

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

希望这对某人有所帮助!

完全成熟的 C# 示例,TableEntity Class 不可知,通过不检索用户定义的字段使用最小带宽。

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