Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get all rows in Azure table Storage in C#?

I am trying to get a list of all entities inside an azure table.

Any idea of how I would write this query?

like image 784
SKLAK Avatar asked May 29 '14 18:05

SKLAK


People also ask

How do I view data stored in Azure table?

To view table data. In Cloud Explorer, open the Azure node, and then open the Storage node. Open the storage account node that you are interested in, and then open the Tables node to see a list of tables for the storage account. Open the shortcut menu for a table, and then select View Table.


2 Answers

To answer your question, you could do something like the following:

var acc = new CloudStorageAccount(                          new StorageCredentials("account name", "account key"), true); var tableClient = acc.CreateCloudTableClient(); var table = tableClient.GetTableReference("table name"); var entities = table.ExecuteQuery(new TableQuery<MyEntity>()).ToList(); 

However please keep in mind that table service returns a maximum of 1000 entities in a single call to it. If there're more than 1000 entities available in your table, it returns a continuation token which can be used to fetch next set of entities. The ExecuteQuery method actually handles this continuation token internally thus if you want to cancel this operation for any reason, you can't do that.

A better approach would be to use ExecuteQuerySegmented method and have your application deal with the token. Here's the sample code to do so:

var acc = new CloudStorageAccount(                          new StorageCredentials("account name", "account key"), true); var tableClient = acc.CreateCloudTableClient(); var table = tableClient.GetTableReference("table name"); TableContinuationToken token = null; var entities = new List<MyEntity>(); do {     var queryResult = table.ExecuteQuerySegmented(new TableQuery<MyEntity>(), token);     entities.AddRange(queryResult.Results);     token = queryResult.ContinuationToken; } while (token != null); 
like image 151
Gaurav Mantri Avatar answered Sep 20 '22 10:09

Gaurav Mantri


If you don't need all rows every time, it's more efficient to retrieve items on demand (lazily) by making use of yield:

public async Task<IEnumerable<T>> GetAll<T>(string tableName) where T : class {     var table = this.GetCloudTable(tableName);     TableContinuationToken token = null;     do     {         var q = new TableQuery<T>();         var queryResult = await table.ExecuteQuerySegmentedAsync(q, token);         foreach (var item in queryResult.Results)         {             yield return item;         }         token = queryResult.ContinuationToken;     } while (token != null); } 

With this approach, you can get all rows, but if you're looping through the results of GetAll() and find what you're looking for, you can just break the loop, and the GetAll() method would stop without retrieving the next rows from the table.

like image 37
Alisson Reinaldo Silva Avatar answered Sep 20 '22 10:09

Alisson Reinaldo Silva