Best way to perform async query Azure Table Storage

Ender2050 picture Ender2050 · Mar 2, 2014 · Viewed 9.7k times · Source

I have a basic Azure table storage query working using the Windows Azure Storage Client 3.0. What's the easiest way to convert this to an async query? Is it possible to use the async await pattern?

//Setup the storage account connection
var cloudStorageAccount = CloudStorageAccount.Parse(connectionString);
var cloudTableClient = cloudStorageAccount.CreateCloudTableClient();
var table = cloudTableClient.GetTableReference("SampleTable");

//Get the context
var context = cloudTableClient.GetTableServiceContext();

//Setup the query
var q = from s in table.CreateQuery<SampleEntity>()
        where s.PartitionKey == sampleUID.ToString()
        select s;

//Get the list
var list = q.ToList();

Inserting and updating entities have XyzAsync() methods... I must be missing something. Thanks for the help.

Answer

Thomas picture Thomas · Dec 14, 2015

Latest versions of the SDk now support async (nuget).

You can execute your query using the ExecuteSegmentedAsync Method :

var query = (from s in table.CreateQuery<SampleEntity>()
            where s.PartitionKey == sampleUID.ToString() select s)
            .AsTableQuery<SampleEntity>();

TableContinuationToken continuationToken = null;
do
{
    // Execute the query async until there is no more result
    var queryResult = await query.ExecuteSegmentedAsync(continuationToken);
    foreach (var entity in queryResult)
    {

    }

    continuationToken = queryResult.ContinuationToken;
} while (continuationToken != null);

I've converted some sample of this tutorial (How to use Table storage from .NET):

  1. Create a table

    async Task CreateATable()
    {
        // Retrieve the storage account from the connection string.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
            CloudConfigurationManager.GetSetting("StorageConnectionString"));
    
        // Create the table client.
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
    
        // Create the table if it doesn't exist.
        CloudTable table = tableClient.GetTableReference("people");
        await table.CreateIfNotExistsAsync();
    }
    
  2. Add an entity to a table

    public class CustomerEntity : TableEntity
    {
        public CustomerEntity(string lastName, string firstName)
        {
            this.PartitionKey = lastName;
            this.RowKey = firstName;
        }
    
        public CustomerEntity() { }
    
        public string Email { get; set; }
    
        public string PhoneNumber { get; set; }
    }
    ...
    //The script:
    // Retrieve the storage account from the connection string.
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
        CloudConfigurationManager.GetSetting("StorageConnectionString"));
    
    // Create the table client.
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
    
    // Create the CloudTable object that represents the "people" table.
    CloudTable table = tableClient.GetTableReference("people");
    
    // Create a new customer entity.
    CustomerEntity customer1 = new CustomerEntity("Harp", "Walter");
    customer1.Email = "[email protected]";
    customer1.PhoneNumber = "425-555-0101";
    
    // Create the TableOperation object that inserts the customer entity.
    TableOperation insertOperation = TableOperation.Insert(customer1);
    
    // Execute the insert operation.
    await table.ExecuteAsync(insertOperation);
    
  3. Insert a batch of entities

    // Retrieve the storage account from the connection string.
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
        CloudConfigurationManager.GetSetting("StorageConnectionString"));
    
    // Create the table client.
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
    
    // Create the CloudTable object that represents the "people" table.
    CloudTable table = tableClient.GetTableReference("people");
    
    // Create the batch operation.
    TableBatchOperation batchOperation = new TableBatchOperation();
    
    // Create a customer entity and add it to the table.
    CustomerEntity customer1 = new CustomerEntity("Smith", "Jeff");
    customer1.Email = "[email protected]";
    customer1.PhoneNumber = "425-555-0104";
    
    // Create another customer entity and add it to the table.
    CustomerEntity customer2 = new CustomerEntity("Smith", "Ben");
    customer2.Email = "[email protected]";
    customer2.PhoneNumber = "425-555-0102";
    
    // Add both customer entities to the batch insert operation.
    batchOperation.Insert(customer1);
    batchOperation.Insert(customer2);
    
    // Execute the batch operation.
    await table.ExecuteBatchAsync(batchOperation);
    
  4. And so on...