我是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 :(得分: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;
}