AzureTableDBRepository.cs 11 KB

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