using HaBookCms.AzureStorage.AzureTable.Interfaces; using HaBookCms.AzureStorage.ServiceExtension; using Microsoft.WindowsAzure.Storage.Table; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace HaBookCms.AzureStorage.AzureTable.Implements { public class AzureTableDBRepository : IAzureTableDBRepository { private readonly CloudTableClient tableClient; private CloudTable table { get; set; } public AzureTableDBRepository(AzureStorageOptions options) { tableClient = TableClientSingleton.getInstance(options.ConnectionString).GetTableClient(); } public AzureTableDBRepository() { } private async Task InitializeTable() { Type t = typeof(T); if (table == null || !table.Name.Equals(t.Name)) { table = tableClient.GetTableReference(t.Name); await table.CreateIfNotExistsAsync(); } } public async Task> FindAll() where T : TableEntity, new() { await InitializeTable(); var exQuery = new TableQuery(); return await QueryList(exQuery); } private async Task> QueryList(TableQuery exQuery) where T : TableEntity, new() { TableContinuationToken continuationToken = null; List entitys = new List(); do { var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken); if (result.Results.Count > 0) { entitys.AddRange(result.ToList()); } continuationToken = result.ContinuationToken; } while (continuationToken != null); return entitys; } private async Task QueryObject(TableQuery exQuery) where T : TableEntity, new() { TableContinuationToken continuationToken = null; T entity = new T(); do { var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken); if (result.Results.Count > 0) { entity = result.ToList().Single(); } continuationToken = result.ContinuationToken; } while (continuationToken != null); return entity; } public async Task Count() where T : TableEntity, new() { await InitializeTable(); TableContinuationToken continuationToken = null; var exQuery = new TableQuery(); List entitys = new List(); do { var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken); if (result.Results.Count > 0) { entitys.AddRange(result.ToList()); } continuationToken = result.ContinuationToken; } while (continuationToken != null); return entitys.Count; } public async Task FindById(string id) where T : TableEntity, new() { await InitializeTable(); var exQuery = new TableQuery(); if (string.IsNullOrEmpty(id)) { exQuery.Where(TableQuery.GenerateFilterCondition("Id", QueryComparisons.Equal, id)); } return await QueryObject(exQuery); } public async Task> FindListByDict(Dictionary dict) where T : TableEntity, new() { await InitializeTable(); var exQuery = new TableQuery(); if (null != dict && dict.Count > 0) { var keys = dict.Keys; foreach (string key in keys) { if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString())) { exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString())); } } } return await QueryList(exQuery); } public async Task> FindListByKey(string key, string value) where T : TableEntity, new() { await InitializeTable(); var exQuery = new TableQuery(); if (string.IsNullOrEmpty(key) && string.IsNullOrEmpty(value)) { exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, value)); } return await QueryList(exQuery); } public async Task FindOneByDict(IDictionary dict) where T : TableEntity, new() { await InitializeTable(); var exQuery = new TableQuery(); if (null != dict && dict.Count > 0) { var keys = dict.Keys; foreach (string key in keys) { if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString())) { exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString())); } } } return await QueryObject(exQuery); } public async Task FindOneByKey(string key, string value) where T : TableEntity, new() { await InitializeTable(); var exQuery = new TableQuery(); if (string.IsNullOrEmpty(key) && string.IsNullOrEmpty(value)) { exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, value)); } return await QueryObject(exQuery); } public async Task> GetEntities(IDictionary dict) where T : TableEntity, new() { await InitializeTable(); var exQuery = new TableQuery(); if (null != dict && dict.Count > 0) { var keys = dict.Keys; foreach (string key in keys) { if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString())) { exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString())); } } } return await QueryList(exQuery); } public async Task> SaveAll(List entitys) where T : TableEntity, new() { await InitializeTable(); IList result = null; Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100), async range => { TableBatchOperation batchOperation = new TableBatchOperation(); for (Int32 i = range.Item1; i < range.Item2; i++) batchOperation.Insert(entitys[i]); result = await table.ExecuteBatchAsync(batchOperation); }); return (List)result; } public async Task> UpdateAll(List entitys) where T : TableEntity, new() { await InitializeTable(); IList result = null; Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100), async range => { TableBatchOperation batchOperation = new TableBatchOperation(); for (Int32 i = range.Item1; i < range.Item2; i++) batchOperation.Replace(entitys[i]); result = await table.ExecuteBatchAsync(batchOperation); }); return (List)result; } public async Task> DeleteAll(List entitys) where T : TableEntity, new() { await InitializeTable(); IList result = null; Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100), async range => { TableBatchOperation batchOperation = new TableBatchOperation(); for (Int32 i = range.Item1; i < range.Item2; i++) batchOperation.Delete(entitys[i]); result = await table.ExecuteBatchAsync(batchOperation); }); return (List)result; } public async Task Save(TableEntity entity) where T : TableEntity, new() { await InitializeTable(); TableOperation operation = TableOperation.Insert(entity); TableResult result = await table.ExecuteAsync(operation); return (T)result.Result; } public async Task Update(TableEntity entity) where T : TableEntity, new() { await InitializeTable(); TableOperation operation = TableOperation.Replace(entity); TableResult result = await table.ExecuteAsync(operation); return (T)result.Result; } public async Task Delete(TableEntity entity) where T : TableEntity, new() { await InitializeTable(); TableOperation operation = TableOperation.Delete(entity); TableResult result = await table.ExecuteAsync(operation); return (T)result.Result; } public async Task> FindListByDictAndLike(Dictionary dict, Dictionary likeDict) where T : TableEntity, new() { throw new NotImplementedException(); } public async Task> FindListByDictAndLikeAndNotEQ(Dictionary dict, Dictionary likeDict, Dictionary notEQDict) where T : TableEntity, new() { throw new NotImplementedException(); } public async Task> FindListByDictAndLikeAndStartWith(Dictionary dict, Dictionary likeDict, Dictionary startDict) where T : TableEntity, new() { throw new NotImplementedException(); } } }