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