AzureTableDBRepository.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. using HaBookCms.AzureStorage.AzureTable.Interfaces;
  2. using HaBookCms.AzureStorage.ServiceExtension;
  3. using Microsoft.WindowsAzure.Storage.Table;
  4. using System;
  5. using System.Collections.Concurrent;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. namespace HaBookCms.AzureStorage.AzureTable.Implements
  10. {
  11. public class AzureTableDBRepository : IAzureTableDBRepository
  12. {
  13. private readonly CloudTableClient tableClient;
  14. private CloudTable table { get; set; }
  15. public AzureTableDBRepository(AzureStorageOptions options)
  16. {
  17. tableClient = TableClientSingleton.getInstance(options.ConnectionString).GetTableClient();
  18. }
  19. public AzureTableDBRepository()
  20. {
  21. }
  22. private async Task InitializeTable<T>()
  23. {
  24. Type t = typeof(T);
  25. if (table == null || !table.Name.Equals(t.Name))
  26. {
  27. table = tableClient.GetTableReference(t.Name);
  28. await table.CreateIfNotExistsAsync();
  29. }
  30. }
  31. public async Task<List<T>> FindAll<T>() where T : TableEntity, new()
  32. {
  33. await InitializeTable<T>();
  34. var exQuery = new TableQuery<T>();
  35. return await QueryList<T>(exQuery);
  36. }
  37. private async Task<List<T>> QueryList<T>(TableQuery<T> exQuery) where T : TableEntity, new()
  38. {
  39. TableContinuationToken continuationToken = null;
  40. List<T> entitys = new List<T>();
  41. do
  42. {
  43. var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken);
  44. if (result.Results.Count > 0)
  45. {
  46. entitys.AddRange(result.ToList());
  47. }
  48. continuationToken = result.ContinuationToken;
  49. } while (continuationToken != null);
  50. return entitys;
  51. }
  52. private async Task<T> QueryObject<T>(TableQuery<T> exQuery) where T : TableEntity, new()
  53. {
  54. TableContinuationToken continuationToken = null;
  55. T entity = new T();
  56. do
  57. {
  58. var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken);
  59. if (result.Results.Count > 0)
  60. {
  61. entity = result.ToList().Single();
  62. }
  63. continuationToken = result.ContinuationToken;
  64. } while (continuationToken != null);
  65. return entity;
  66. }
  67. public async Task<int> Count<T>() where T : TableEntity, new()
  68. {
  69. await InitializeTable<T>();
  70. TableContinuationToken continuationToken = null;
  71. var exQuery = new TableQuery<T>();
  72. List<T> entitys = new List<T>();
  73. do
  74. {
  75. var result = await table.ExecuteQuerySegmentedAsync(exQuery, continuationToken);
  76. if (result.Results.Count > 0)
  77. {
  78. entitys.AddRange(result.ToList());
  79. }
  80. continuationToken = result.ContinuationToken;
  81. } while (continuationToken != null);
  82. return entitys.Count;
  83. }
  84. public async Task<T> FindById<T>(string id) where T : TableEntity, new()
  85. {
  86. await InitializeTable<T>();
  87. var exQuery = new TableQuery<T>();
  88. if (string.IsNullOrEmpty(id))
  89. {
  90. exQuery.Where(TableQuery.GenerateFilterCondition("Id", QueryComparisons.Equal, id));
  91. }
  92. return await QueryObject<T>(exQuery);
  93. }
  94. public async Task<List<T>> FindListByDict<T>(Dictionary<string, object> dict) where T : TableEntity, new()
  95. {
  96. await InitializeTable<T>();
  97. var exQuery = new TableQuery<T>();
  98. if (null != dict && dict.Count > 0)
  99. {
  100. var keys = dict.Keys;
  101. foreach (string key in keys)
  102. {
  103. if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
  104. {
  105. exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal,
  106. dict[key].ToString()));
  107. }
  108. }
  109. }
  110. return await QueryList<T>(exQuery);
  111. }
  112. public async Task<List<T>> FindListByKey<T>(string key, string value) where T : TableEntity, new()
  113. {
  114. await InitializeTable<T>();
  115. var exQuery = new TableQuery<T>();
  116. if (string.IsNullOrEmpty(key) && string.IsNullOrEmpty(value))
  117. {
  118. exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, value));
  119. }
  120. return await QueryList<T>(exQuery);
  121. }
  122. public async Task<T> FindOneByDict<T>(IDictionary<string, object> dict) where T : TableEntity, new()
  123. {
  124. await InitializeTable<T>();
  125. var exQuery = new TableQuery<T>();
  126. if (null != dict && dict.Count > 0)
  127. {
  128. var keys = dict.Keys;
  129. foreach (string key in keys)
  130. {
  131. if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
  132. {
  133. exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  134. }
  135. }
  136. }
  137. return await QueryObject<T>(exQuery);
  138. }
  139. public async Task<T> FindOneByKey<T>(string key, string value) where T : TableEntity, new()
  140. {
  141. await InitializeTable<T>();
  142. var exQuery = new TableQuery<T>();
  143. if (string.IsNullOrEmpty(key) && string.IsNullOrEmpty(value))
  144. {
  145. exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal,
  146. value));
  147. }
  148. return await QueryObject<T>(exQuery);
  149. }
  150. public async Task<List<T>> GetEntities<T>(IDictionary<string, object> dict) where T : TableEntity, new()
  151. {
  152. await InitializeTable<T>();
  153. var exQuery = new TableQuery<T>();
  154. if (null != dict && dict.Count > 0)
  155. {
  156. var keys = dict.Keys;
  157. foreach (string key in keys)
  158. {
  159. if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
  160. {
  161. exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal,
  162. dict[key].ToString()));
  163. }
  164. }
  165. }
  166. return await QueryList<T>(exQuery);
  167. }
  168. public async Task<List<T>> SaveAll<T>(List<T> entitys) where T : TableEntity, new()
  169. {
  170. await InitializeTable<T>();
  171. IList<TableResult> result = null;
  172. Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100),
  173. async range =>
  174. {
  175. TableBatchOperation batchOperation = new TableBatchOperation();
  176. for (Int32 i = range.Item1; i < range.Item2; i++)
  177. batchOperation.Insert(entitys[i]);
  178. result = await table.ExecuteBatchAsync(batchOperation);
  179. });
  180. return (List<T>)result;
  181. }
  182. public async Task<List<T>> UpdateAll<T>(List<T> entitys) where T : TableEntity, new()
  183. {
  184. await InitializeTable<T>();
  185. IList<TableResult> result = null;
  186. Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100),
  187. async range =>
  188. {
  189. TableBatchOperation batchOperation = new TableBatchOperation();
  190. for (Int32 i = range.Item1; i < range.Item2; i++)
  191. batchOperation.Replace(entitys[i]);
  192. result = await table.ExecuteBatchAsync(batchOperation);
  193. });
  194. return (List<T>)result;
  195. }
  196. public async Task<List<T>> DeleteAll<T>(List<T> entitys) where T : TableEntity, new()
  197. {
  198. await InitializeTable<T>();
  199. IList<TableResult> result = null;
  200. Parallel.ForEach(Partitioner.Create(0, entitys.Count, 100),
  201. async range =>
  202. {
  203. TableBatchOperation batchOperation = new TableBatchOperation();
  204. for (Int32 i = range.Item1; i < range.Item2; i++)
  205. batchOperation.Delete(entitys[i]);
  206. result = await table.ExecuteBatchAsync(batchOperation);
  207. });
  208. return (List<T>)result;
  209. }
  210. public async Task<T> Save<T>(TableEntity entity) where T : TableEntity, new()
  211. {
  212. await InitializeTable<T>();
  213. TableOperation operation = TableOperation.Insert(entity);
  214. TableResult result = await table.ExecuteAsync(operation);
  215. return (T)result.Result;
  216. }
  217. public async Task<T> Update<T>(TableEntity entity) where T : TableEntity, new()
  218. {
  219. await InitializeTable<T>();
  220. TableOperation operation = TableOperation.Replace(entity);
  221. TableResult result = await table.ExecuteAsync(operation);
  222. return (T)result.Result;
  223. }
  224. public async Task<T> Delete<T>(TableEntity entity) where T : TableEntity, new()
  225. {
  226. await InitializeTable<T>();
  227. TableOperation operation = TableOperation.Delete(entity);
  228. TableResult result = await table.ExecuteAsync(operation);
  229. return (T)result.Result;
  230. }
  231. public async Task<List<T>> FindListByDictAndLike<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict) where T : TableEntity, new()
  232. {
  233. throw new NotImplementedException();
  234. }
  235. public async Task<List<T>> FindListByDictAndLikeAndNotEQ<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict, Dictionary<string, object> notEQDict) where T : TableEntity, new()
  236. {
  237. throw new NotImplementedException();
  238. }
  239. public async Task<List<T>> FindListByDictAndLikeAndStartWith<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict, Dictionary<string, object> startDict) where T : TableEntity, new()
  240. {
  241. throw new NotImplementedException();
  242. }
  243. }
  244. }