Problem
How to use Azure Table storage in ASP.NET Core.
Solution
Create a class library and add NuGet package: WindowsAzure.Storage
Add a class to encapsulate the settings.
- public class AzureTableSettings  
-   {  
-       public AzureTableSettings(string storageAccount,  
-                                      string storageKey,  
-                                      string tableName)  
-       {  
-           if (string.IsNullOrEmpty(storageAccount))  
-               throw new ArgumentNullException("StorageAccount");  
-   
-           if (string.IsNullOrEmpty(storageKey))  
-               throw new ArgumentNullException("StorageKey");  
-   
-           if (string.IsNullOrEmpty(tableName))  
-               throw new ArgumentNullException("TableName");  
-   
-           this.StorageAccount = storageAccount;  
-           this.StorageKey = storageKey;  
-           this.TableName = tableName;  
-       }  
-   
-       public string StorageAccount { get; }  
-       public string StorageKey { get; }  
-       public string TableName { get; }  
-   }  
 
 
 
Add a class to encapsulate the storage access. Add a private helper method to access the storage.
- private async Task<CloudTable> GetTableAsync()  
-    {  
-          
-        CloudStorageAccount storageAccount = new CloudStorageAccount(  
-            new StorageCredentials(this.settings.StorageAccount, this.settings.StorageKey), false);  
-   
-          
-        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();  
-   
-          
-        CloudTable table = tableClient.GetTableReference(this.settings.TableName);  
-        await table.CreateIfNotExistsAsync();  
-   
-        return table;  
-    } 
 
 
 
Now, add public methods for the storage.
- public async Task<List<T>> GetList()  
-  {  
-        
-      CloudTable table = await GetTableAsync();  
-   
-        
-      TableQuery<T> query = new TableQuery<T>();  
-   
-      List<T> results = new List<T>();  
-      TableContinuationToken continuationToken = null;  
-      do  
-      {  
-          TableQuerySegment<T> queryResults =  
-              await table.ExecuteQuerySegmentedAsync(query, continuationToken);  
-   
-          continuationToken = queryResults.ContinuationToken;  
-          results.AddRange(queryResults.Results);  
-   
-      } while (continuationToken != null);  
-   
-      return results;  
-  }  
-    
-  public async Task<List<T>> GetList(string partitionKey)  
-  {  
-        
-      CloudTable table = await GetTableAsync();  
-   
-        
-      TableQuery<T> query = new TableQuery<T>()  
-                                  .Where(TableQuery.GenerateFilterCondition("PartitionKey",   
-                                          QueryComparisons.Equal, partitionKey));  
-   
-      List<T> results = new List<T>();  
-      TableContinuationToken continuationToken = null;  
-      do  
-      {  
-          TableQuerySegment<T> queryResults =  
-              await table.ExecuteQuerySegmentedAsync(query, continuationToken);  
-   
-          continuationToken = queryResults.ContinuationToken;  
-   
-          results.AddRange(queryResults.Results);  
-   
-      } while (continuationToken != null);  
-   
-      return results;  
-  }  
-    
-  public async Task<T> GetItem(string partitionKey, string rowKey)  
-  {  
-        
-      CloudTable table = await GetTableAsync();  
-   
-        
-      TableOperation operation = TableOperation.Retrieve<T>(partitionKey, rowKey);  
-   
-        
-      TableResult result = await table.ExecuteAsync(operation);  
-   
-      return (T)(dynamic)result.Result;  
-  }  
-    
-  public async Task Insert(T item)  
-  {  
-        
-      CloudTable table = await GetTableAsync();  
-   
-        
-      TableOperation operation = TableOperation.Insert(item);  
-   
-        
-      await table.ExecuteAsync(operation);  
-  }  
-    
-  public async Task Update(T item)  
-  {  
-        
-      CloudTable table = await GetTableAsync();  
-   
-        
-      TableOperation operation = TableOperation.InsertOrReplace(item);  
-   
-        
-      await table.ExecuteAsync(operation);  
-  }  
-    
-  public async Task Delete(string partitionKey, string rowKey)  
-  {  
-        
-      T item = await GetItem(partitionKey, rowKey);  
-        
-        
-      CloudTable table = await GetTableAsync();  
-   
-        
-      TableOperation operation = TableOperation.Delete(item);  
-   
-        
-      await table.ExecuteAsync(operation);  
-  }  
 
 
 
Inject and use storage
- private readonly IAzureTableStorage<Movie> repository;  
-   
-   public MovieService(IAzureTableStorage<Movie> repository)  
-   {  
-       this.repository = repository;  
-   } 
 
 
 
In ASP.NET Core Web application, configure services.
- public void ConfigureServices(  
-       IServiceCollection services)  
-   {  
-       services.AddScoped<IAzureTableStorage<Movie>>(factory =>  
-       {  
-           return new AzureTableStorage<Movie>(  
-               new AzureTableSettings(  
-                   storageAccount: Configuration["Table_StorageAccount"],  
-                   storageKey: Configuration["Table_StorageKey"],  
-                   tableName: Configuration["Table_TableName"]));  
-       });  
-       services.AddScoped<IMovieService, MovieService>();  
-   
-       services.AddMvc();  
-   }  
 
 
 
Discussion
The sample code will require you to setup Azure account, storage account, and table. Instructions for these could be found here.
Source Code
GitHub