从azure表存储中获取所有记录

pit*_*met 15 c# azure azure-table-storage

使用此代码块

try
{
    StorageCredentials creds = new StorageCredentials(accountName, accountKey);
    CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);

    CloudTableClient client = account.CreateCloudTableClient();
    CloudTable table = client.GetTableReference("serviceAlerts");

    TableOperation retrieveOperation = TableOperation.Retrieve<ServiceAlertsEntity>("ServiceAlerts", "b9ccd839-dd99-4358-b90f-46781b87f933");

    TableResult query = table.Execute(retrieveOperation);

    if (query.Result != null)
    {
        outline = outline + ((ServiceAlertsEntity) query.Result).alertMessage + " * ";
    }
    else
    {
        Console.WriteLine("No Alerts");
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}
Run Code Online (Sandbox Code Playgroud)

我能够使用检索中提到的分区和rowkey检索单个记录.

有没有办法可以获得存储在ServiceAlerts分区中的所有记录?

我已尝试使用通配符(*)作为第二个参数

TableOperation retrieveOperation = TableOperation.Retrieve<ServiceAlertsEntity>(
      "ServiceAlerts","b9ccd839-dd99-4358-b90f-46781b87f933");
Run Code Online (Sandbox Code Playgroud)

但它不会返回任何东西.

Mur*_*oft 9

您需要指定TableQuery,这将为您提供所有实体,或者您可以指定a TableQuery.GenerateFilterCondition来过滤行.

TableQuery<ServiceAlertsEntity> query = new TableQuery<ServiceAlertsEntity>();

foreach (ServiceAlertsEntity entity in table.ExecuteQuery(query))
{
    Console.WriteLine("{0}, {1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey,
                        entity.Field1, entity.Field2);
}
Run Code Online (Sandbox Code Playgroud)

  • table.ExecuteQuery返回一个IEnumerable,这意味着它将把所有数据带到多个分区服务器上。这种方法不好 (5认同)
  • 如果“CloudTable”不包含“Execute”的定义怎么办? (2认同)

ric*_*aux 9

如果需要进一步控制返回的记录,则可以一次ExecuteQuerySegmentedAsync检索一页(约1,000条记录)中的数据。

    var alerts = new List<ServiceAlertsEntity>();

    var query = new TableQuery<ServiceAlertsEntity>();
    TableContinuationToken continuationToken = null;
    do
    {
        var page = await table.ExecuteQuerySegmentedAsync(query, continuationToken);
        continuationToken = page.ContinuationToken;
        alerts.AddRange(page.Results);
    }
    while (continuationToken != null);
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要限制结果(例如通过分区键),则可以通过Where在上面的代码中向查询添加子句来添加过滤条件。

    var pk = "abc";
    var filterPk = TableQuery.GenerateFilterCondition(
        nameof(ServiceAlertsEntity.PartitionKey),
        QueryComparisons.Equal, pk);

    var query = new TableQuery<ServiceAlertsEntity>().Where(filterPk);
Run Code Online (Sandbox Code Playgroud)

MS Azure参考