AzureTableDBRepository.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. using TEAMModelOS.SDK.Module.AzureTable.Configuration;
  2. using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
  3. using TEAMModelOS.SDK.Extension.DataResult.PageToken;
  4. using Microsoft.WindowsAzure.Storage.Table;
  5. using System;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.SDK.Helper.Security.AESCrypt;
  12. using TEAMModelOS.SDK.Context.Exception;
  13. using System.Reflection;
  14. using TEAMModelOS.SDK.Context.Attributes.Azure;
  15. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  16. using TEAMModelOS.SDK.Context.Configuration;
  17. using Microsoft.Extensions.Configuration;
  18. namespace TEAMModelOS.SDK.Module.AzureTable.Implements
  19. {
  20. public class AzureTableDBRepository : IAzureTableDBRepository
  21. {
  22. private readonly string china = "417A7572654368696E612020202020202020202020202020202020202020202097EB27FCC1F03349787DCD35F4DE22BBDFEDC90F24738B1D7FB9167A2C191BE671B512E17D48B73A002FC98867345CD59D3250AF59FD5FDFFC67976108F9E3BC9E9F75EDE605B058C1821D16BD9EB753B8E7D39FF48163430C1B5F3B6150195B880C3FCB87D35BF3540432734B768EC28C77B4CF0D556E794DE57979C1E01C429E66F7B2794D9940CF287F2B22A22E5F266B949D5E523E709FF37229E45D1A8FC8C4341E0A8346BB976CCB3D91802FFE5A4A28577898B4E942B5BA3A4A7B796FA673782D405060E7F2CBA4F67DF59F47";
  23. private readonly string global = "417A757265476C6F62616C2020202020202020202020202020202020202020206956019D195ED330AFA660D369B9464FC5E90AB3A106FDDD7978A2772DB186CDAE21C6CBFDE2B6739F089E853B3171A27841026E61C51666347F63FDF63E4377448D493B05CF6CDB3791946B9145825DD7756392EB8EA36DBF42E5C1C0021CEC2CDB5F4EA57EBCFA98B17D7236FA2CDCA6E7FCBE1DDC45BEAF691A2462A8BC3C429CBC4BCCA3192E554D23758AA8EA5937F988C927534C70A4769ED33878BEC10E2550F121E4AEB5A2DA213F2902D602A758C7D93D5DED368544F8A86D2A0CAA7813D1D950EC81D544EE41A8EDC84173";
  24. private readonly CloudTableClient tableClient;
  25. private CloudTable Table { get; set; }
  26. //public AzureTableDBRepository(AzureTableOptions options)
  27. //{
  28. // if (!string.IsNullOrEmpty(options.ConnectionString))
  29. // {
  30. // tableClient = TableClientSingleton.getInstance(options.ConnectionString).GetTableClient();
  31. // }
  32. // else if (AzureTableConfig.AZURE_CHINA.Equals(options.AzureTableDialect))
  33. // {
  34. // AESCrypt crypt = new AESCrypt();
  35. // tableClient = TableClientSingleton.getInstance(crypt.Decrypt(china, options.AzureTableDialect)).GetTableClient();
  36. // }
  37. // else if (AzureTableConfig.AZURE_GLOBAL.Equals(options.AzureTableDialect))
  38. // {
  39. // AESCrypt crypt = new AESCrypt();
  40. // tableClient = TableClientSingleton.getInstance(crypt.Decrypt(global, options.AzureTableDialect)).GetTableClient();
  41. // }
  42. // else { throw new BizException("请设置正确的AzureTable数据库配置信息!"); }
  43. //}
  44. public AzureTableDBRepository()
  45. {
  46. AzureTableOptions options= BaseConfigModel.Configuration.GetSection("Azure:Table").Get<AzureTableOptions>();
  47. if (!string.IsNullOrEmpty(options.ConnectionString))
  48. {
  49. tableClient = TableClientSingleton.getInstance(options.ConnectionString).GetTableClient();
  50. }
  51. else if (AzureTableConfig.AZURE_CHINA.Equals(options.AzureTableDialect))
  52. {
  53. AESCrypt crypt = new AESCrypt();
  54. tableClient = TableClientSingleton.getInstance(crypt.Decrypt(china, options.AzureTableDialect)).GetTableClient();
  55. }
  56. else if (AzureTableConfig.AZURE_GLOBAL.Equals(options.AzureTableDialect))
  57. {
  58. AESCrypt crypt = new AESCrypt();
  59. tableClient = TableClientSingleton.getInstance(crypt.Decrypt(global, options.AzureTableDialect)).GetTableClient();
  60. }
  61. else { throw new BizException("请设置正确的AzureTable数据库配置信息!"); }
  62. }
  63. private async Task<string> InitializeTable<T>()
  64. {
  65. string TableName = GetTableSpace<T>();
  66. if (Table == null || !Table.Name.Equals(TableName))
  67. {
  68. Table = tableClient.GetTableReference(TableName);
  69. await Table.CreateIfNotExistsAsync();
  70. }
  71. return TableName;
  72. }
  73. private string GetTableSpace<T>()
  74. {
  75. Type type = typeof(T);
  76. string Name = type.Name;
  77. object[] attributes = type.GetCustomAttributes(true);
  78. foreach (object attribute in attributes) //2.通过映射,找到成员属性上关联的特性类实例,
  79. {
  80. if (attribute is TableSpaceAttribute tableSpace)
  81. {
  82. Name = tableSpace.Name + Name;
  83. }
  84. }
  85. return Name;
  86. }
  87. public async Task<List<T>> FindAll<T>() where T : TableEntity, new()
  88. {
  89. string TableName = await InitializeTable<T>();
  90. var exQuery = new TableQuery<T>();
  91. return await QueryList<T>(exQuery, TableName);
  92. }
  93. private async Task<List<T>> QueryList<T>(TableQuery<T> exQuery, string TableName) where T : TableEntity, new()
  94. {
  95. TableContinuationToken continuationToken = null;
  96. List<T> entitys = new List<T>();
  97. do
  98. {
  99. var result = await tableClient.GetTableReference(TableName).ExecuteQuerySegmentedAsync(exQuery, continuationToken);
  100. if (result.Results.Count > 0)
  101. {
  102. entitys.AddRange(result.ToList());
  103. }
  104. continuationToken = result.ContinuationToken;
  105. } while (continuationToken != null);
  106. return entitys;
  107. }
  108. private async Task<T> QueryObject<T>(TableQuery<T> exQuery, string TableName) where T : TableEntity, new()
  109. {
  110. TableContinuationToken continuationToken = null;
  111. T entity = new T();
  112. do
  113. {
  114. var result = await tableClient.GetTableReference(TableName).ExecuteQuerySegmentedAsync(exQuery, continuationToken);
  115. if (result.Results.Count > 0)
  116. {
  117. entity = result.ToList().Single();
  118. }
  119. continuationToken = result.ContinuationToken;
  120. } while (continuationToken != null);
  121. return entity;
  122. }
  123. public async Task<int> Count<T>(TableContinuationToken continuationToken) where T : TableEntity, new()
  124. {
  125. string TableName = await InitializeTable<T>();
  126. var exQuery = new TableQuery<T>();
  127. List<T> entitys = new List<T>();
  128. do
  129. {
  130. var result = await tableClient.GetTableReference(TableName).ExecuteQuerySegmentedAsync(exQuery, continuationToken);
  131. if (result.Results.Count > 0)
  132. {
  133. entitys.AddRange(result.ToList());
  134. }
  135. continuationToken = result.ContinuationToken;
  136. } while (continuationToken != null);
  137. return entitys.Count;
  138. }
  139. public async Task<int> Count<T>() where T : TableEntity, new()
  140. {
  141. string TableName = await InitializeTable<T>();
  142. TableContinuationToken continuationToken = null;
  143. var exQuery = new TableQuery<T>();
  144. List<T> entitys = new List<T>();
  145. do
  146. {
  147. var result = await tableClient.GetTableReference(TableName).ExecuteQuerySegmentedAsync(exQuery, continuationToken);
  148. if (result.Results.Count > 0)
  149. {
  150. entitys.AddRange(result.ToList());
  151. }
  152. continuationToken = result.ContinuationToken;
  153. } while (continuationToken != null);
  154. return entitys.Count;
  155. }
  156. public async Task<T> FindByRowKey<T>(string id) where T : TableEntity, new()
  157. {
  158. string TableName = await InitializeTable<T>();
  159. var exQuery = new TableQuery<T>();
  160. if (!string.IsNullOrEmpty(id))
  161. {
  162. string typeStr = SwitchType<T>(id, "RowKey");
  163. exQuery.Where(typeStr);
  164. // exQuery.Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, id));
  165. return await QueryObject<T>(exQuery, TableName);
  166. }
  167. else
  168. {
  169. return null;
  170. }
  171. }
  172. public async Task<List<T>> FindListByDict<T>(Dictionary<string, object> dict) where T : TableEntity, new()
  173. {
  174. string TableName = await InitializeTable<T>();
  175. var exQuery = new TableQuery<T>();
  176. StringBuilder builder = new StringBuilder();
  177. if (null != dict && dict.Count > 0)
  178. {
  179. var keys = dict.Keys;
  180. int index = 1;
  181. foreach (string key in keys)
  182. {
  183. if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
  184. {
  185. string typeStr = SwitchType<T>(dict[key], key);
  186. if (index == 1)
  187. {
  188. //builder.Append(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  189. builder.Append(typeStr);
  190. }
  191. else
  192. {
  193. //builder.Append(" " + TableOperators.And + " " + TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  194. builder.Append(" " + TableOperators.And + " " + typeStr);
  195. }
  196. index++;
  197. }
  198. else {
  199. throw new Exception("The parameter must have value!");
  200. }
  201. }
  202. exQuery.Where(builder.ToString());
  203. return await QueryList<T>(exQuery, TableName);
  204. }
  205. else
  206. {
  207. return null;
  208. }
  209. }
  210. public async Task<List<T>> FindListByKey<T>(string key, object value) where T : TableEntity, new()
  211. {
  212. string TableName = await InitializeTable<T>();
  213. var exQuery = new TableQuery<T>();
  214. if (!string.IsNullOrEmpty(key) && value != null && !string.IsNullOrEmpty(value.ToString()))
  215. {
  216. string typeStr = SwitchType<T>(value, key);
  217. exQuery.Where(typeStr);
  218. //exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, value));
  219. return await QueryList<T>(exQuery, TableName);
  220. }
  221. else
  222. {
  223. return null;
  224. }
  225. }
  226. public async Task<T> FindOneByDict<T>(IDictionary<string, object> dict) where T : TableEntity, new()
  227. {
  228. string TableName = await InitializeTable<T>();
  229. var exQuery = new TableQuery<T>();
  230. StringBuilder builder = new StringBuilder();
  231. if (null != dict && dict.Count > 0)
  232. {
  233. var keys = dict.Keys;
  234. int index = 1;
  235. foreach (string key in keys)
  236. {
  237. if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
  238. {
  239. string typeStr = SwitchType<T>(dict[key], key);
  240. if (index == 1)
  241. {
  242. //builder.Append(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  243. builder.Append(typeStr);
  244. }
  245. else
  246. {
  247. // builder.Append(" " + TableOperators.And + " " + TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  248. builder.Append(" " + TableOperators.And + " " + typeStr);
  249. }
  250. index++;
  251. }
  252. else
  253. {
  254. throw new Exception("The parameter must have value!");
  255. }
  256. }
  257. exQuery.Where(builder.ToString());
  258. return await QueryObject<T>(exQuery, TableName);
  259. }
  260. else
  261. {
  262. return null;
  263. }
  264. }
  265. private static string SwitchType<T>(object obj, string key)
  266. {
  267. Type objType = typeof(T);
  268. PropertyInfo property = objType.GetProperty(key);
  269. //Type s = obj.GetType();
  270. //TypeCode typeCode = Type.GetTypeCode(s);
  271. if (property == null) {
  272. return null;
  273. }
  274. TypeCode typeCode = Type.GetTypeCode(property.PropertyType);
  275. switch (typeCode)
  276. {
  277. case TypeCode.String: return TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, obj.ToString());
  278. case TypeCode.Int32: return TableQuery.GenerateFilterConditionForInt(key, QueryComparisons.Equal, int.Parse( obj.ToString()));
  279. case TypeCode.Double: return TableQuery.GenerateFilterConditionForDouble(key, QueryComparisons.Equal, (double)obj);
  280. case TypeCode.Byte: return TableQuery.GenerateFilterConditionForBinary(key, QueryComparisons.Equal, (byte[])obj);
  281. case TypeCode.Boolean: return TableQuery.GenerateFilterConditionForBool(key, QueryComparisons.Equal, (bool)obj);
  282. case TypeCode.DateTime: return TableQuery.GenerateFilterConditionForDate(key, QueryComparisons.Equal, (DateTimeOffset)obj);
  283. case TypeCode.Int64: return TableQuery.GenerateFilterConditionForLong(key, QueryComparisons.Equal, long.Parse(obj.ToString()));
  284. default: return null;
  285. }
  286. }
  287. public async Task<T> FindOneByKey<T>(string key, object value) where T : TableEntity, new()
  288. {
  289. string TableName = await InitializeTable<T>();
  290. var exQuery = new TableQuery<T>();
  291. if (!string.IsNullOrEmpty(key) && value != null && !string.IsNullOrEmpty(value.ToString()))
  292. {
  293. string typeStr = SwitchType<T>(value, key);
  294. exQuery.Where(typeStr);
  295. //exQuery.Where(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal,
  296. // value));
  297. return await QueryObject<T>(exQuery, TableName);
  298. }
  299. else
  300. {
  301. return null;
  302. }
  303. }
  304. public async Task<List<T>> GetEntities<T>(IDictionary<string, object> dict) where T : TableEntity, new()
  305. {
  306. string TableName = await InitializeTable<T>();
  307. var exQuery = new TableQuery<T>();
  308. StringBuilder builder = new StringBuilder();
  309. if (null != dict && dict.Count > 0)
  310. {
  311. var keys = dict.Keys;
  312. int index = 1;
  313. foreach (string key in keys)
  314. {
  315. if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
  316. {
  317. string typeStr = SwitchType<T>(dict, key);
  318. if (index == 1)
  319. {
  320. //builder.Append(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  321. builder.Append(typeStr);
  322. }
  323. else
  324. {
  325. // builder.Append(" " + TableOperators.And + " " + TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  326. builder.Append(" " + TableOperators.And + " " + typeStr);
  327. }
  328. index++;
  329. }
  330. else
  331. {
  332. throw new Exception("The parameter must have value!");
  333. }
  334. }
  335. exQuery.Where(builder.ToString());
  336. return await QueryList<T>(exQuery, TableName);
  337. }
  338. else
  339. {
  340. return null;
  341. }
  342. }
  343. public async Task<List<T>> SaveAll<T>(List<T> entitys) where T : TableEntity, new()
  344. {
  345. if (entitys.IsEmpty())
  346. {
  347. return null;
  348. }
  349. string TableName = await InitializeTable<T>();
  350. IList<Dictionary<string, List<T>>> listInfo = new List<Dictionary<string, List<T>>>();
  351. foreach (IGrouping<string, T> group in entitys.GroupBy(c => c.PartitionKey))
  352. {
  353. Dictionary<string, List<T>> dictInfo = new Dictionary<string, List<T>>
  354. {
  355. { group.Key, group.ToList() }
  356. };
  357. listInfo.Add(dictInfo);
  358. }
  359. foreach (Dictionary<string, List<T>> dict in listInfo)
  360. {
  361. IList<TableResult> result = null;
  362. foreach (string key in dict.Keys)
  363. {
  364. List<T> values = dict[key];
  365. //Parallel.ForEach(Partitioner.Create(0, values.Count, 100),
  366. // async range =>
  367. // {
  368. // TableBatchOperation batchOperation = new TableBatchOperation();
  369. // for (Int32 i = range.Item1; i < range.Item2; i++)
  370. // batchOperation.Insert(values[i]);
  371. // result = await tableClient.GetTableReference(TableName).ExecuteBatchAsync(batchOperation);
  372. // });
  373. int pageSize = 100;
  374. int pages = (int)Math.Ceiling((double)values.Count / pageSize);
  375. for (int i = 0; i < pages; i++)
  376. {
  377. List<T> lists = values.Skip((i) * pageSize).Take(pageSize).ToList();
  378. TableBatchOperation batchOperation = new TableBatchOperation();
  379. for (int j = 0; j < lists.Count; j++)
  380. {
  381. batchOperation.Insert(lists[j]);
  382. }
  383. result = await tableClient.GetTableReference(TableName).ExecuteBatchAsync(batchOperation);
  384. }
  385. }
  386. }
  387. return entitys;
  388. }
  389. public async Task<List<T>> UpdateAll<T>(List<T> entitys) where T : TableEntity, new()
  390. {
  391. if (entitys.IsEmpty())
  392. {
  393. return null;
  394. }
  395. string TableName = await InitializeTable<T>();
  396. IList<Dictionary<string, List<T>>> listInfo = new List<Dictionary<string, List<T>>>();
  397. foreach (IGrouping<string, T> group in entitys.GroupBy(c => c.PartitionKey))
  398. {
  399. Dictionary<string, List<T>> dictInfo = new Dictionary<string, List<T>>
  400. {
  401. { group.Key, group.ToList() }
  402. };
  403. listInfo.Add(dictInfo);
  404. }
  405. foreach (Dictionary<string, List<T>> dict in listInfo)
  406. {
  407. IList<TableResult> result = null;
  408. foreach (string key in dict.Keys)
  409. {
  410. List<T> values = dict[key];
  411. //Parallel.ForEach(Partitioner.Create(0, values.Count, 100),
  412. // async range =>
  413. // {
  414. // TableBatchOperation batchOperation = new TableBatchOperation();
  415. // for (Int32 i = range.Item1; i < range.Item2; i++)
  416. // batchOperation.Replace(values[i]);
  417. // result = await tableClient.GetTableReference(TableName).ExecuteBatchAsync(batchOperation);
  418. // });
  419. int pageSize = 100;
  420. int pages = (int)Math.Ceiling((double)values.Count / pageSize);
  421. for (int i = 0; i < pages; i++)
  422. {
  423. List<T> lists = values.Skip((i) * pageSize).Take(pageSize).ToList();
  424. TableBatchOperation batchOperation = new TableBatchOperation();
  425. for (int j = 0; j < lists.Count; j++)
  426. {
  427. batchOperation.Replace(lists[j]);
  428. }
  429. result = await tableClient.GetTableReference(TableName).ExecuteBatchAsync(batchOperation);
  430. }
  431. }
  432. }
  433. return entitys;
  434. }
  435. public async Task<List<T>> SaveOrUpdateAll<T>(List<T> entitys) where T : TableEntity, new()
  436. {
  437. if (entitys.IsEmpty())
  438. {
  439. return null;
  440. }
  441. string TableName = await InitializeTable<T>();
  442. IList<Dictionary<string, List<T>>> listInfo = new List<Dictionary<string, List<T>>>();
  443. foreach (IGrouping<string, T> group in entitys.GroupBy(c => c.PartitionKey))
  444. {
  445. Dictionary<string, List<T>> dictInfo = new Dictionary<string, List<T>>
  446. {
  447. { group.Key, group.ToList() }
  448. };
  449. listInfo.Add(dictInfo);
  450. }
  451. foreach (Dictionary<string, List<T>> dict in listInfo)
  452. {
  453. IList<TableResult> result = null;
  454. foreach (string key in dict.Keys)
  455. {
  456. List<T> values = dict[key];
  457. //Parallel.ForEach(Partitioner.Create(0, values.Count, 50),
  458. // async range =>
  459. // {
  460. // TableBatchOperation batchOperation = new TableBatchOperation();
  461. // for (Int32 i = range.Item1; i < range.Item2; i++)
  462. // batchOperation.InsertOrReplace(values[i]);
  463. // result = await tableClient.GetTableReference(TableName).ExecuteBatchAsync(batchOperation);
  464. // });
  465. int pageSize = 100;
  466. int pages = (int)Math.Ceiling((double)values.Count/ pageSize);
  467. for (int i= 0; i < pages; i++) {
  468. List<T> lists= values.Skip((i) * pageSize).Take(pageSize).ToList();
  469. TableBatchOperation batchOperation = new TableBatchOperation();
  470. for (int j = 0; j < lists.Count; j++)
  471. {
  472. batchOperation.InsertOrReplace(lists[j]);
  473. }
  474. result = await tableClient.GetTableReference(TableName).ExecuteBatchAsync(batchOperation);
  475. }
  476. }
  477. }
  478. return entitys;
  479. }
  480. public async Task<List<T>> DeleteAll<T>(List<T> entitys) where T : TableEntity, new()
  481. {
  482. if (entitys.IsEmpty())
  483. {
  484. return null;
  485. }
  486. string TableName = await InitializeTable<T>();
  487. IList<Dictionary<string, List<T>>> listInfo = new List<Dictionary<string, List<T>>>();
  488. foreach (IGrouping<string, T> group in entitys.GroupBy(c => c.PartitionKey))
  489. {
  490. Dictionary<string, List<T>> dictInfo = new Dictionary<string, List<T>>
  491. {
  492. { group.Key, group.ToList() }
  493. };
  494. listInfo.Add(dictInfo);
  495. }
  496. foreach (Dictionary<string, List<T>> dict in listInfo)
  497. {
  498. IList<TableResult> result = null;
  499. foreach (string key in dict.Keys)
  500. {
  501. List<T> values = dict[key];
  502. //Parallel.ForEach(Partitioner.Create(0, values.Count, 100),
  503. // async range =>
  504. // {
  505. // TableBatchOperation batchOperation = new TableBatchOperation();
  506. // for (Int32 i = range.Item1; i < range.Item2; i++)
  507. // batchOperation.Delete(values[i]);
  508. // result = await tableClient.GetTableReference(TableName).ExecuteBatchAsync(batchOperation);
  509. // });
  510. int pageSize = 100;
  511. int pages = (int)Math.Ceiling((double)values.Count / pageSize);
  512. for (int i = 0; i < pages; i++)
  513. {
  514. List<T> lists = values.Skip((i) * pageSize).Take(pageSize).ToList();
  515. TableBatchOperation batchOperation = new TableBatchOperation();
  516. for (int j = 0; j < lists.Count; j++)
  517. {
  518. batchOperation.Delete(lists[j]);
  519. }
  520. result = await tableClient.GetTableReference(TableName).ExecuteBatchAsync(batchOperation);
  521. }
  522. }
  523. }
  524. return entitys;
  525. }
  526. public async Task<T> Save<T>(TableEntity entity) where T : TableEntity, new()
  527. {
  528. string TableName = await InitializeTable<T>();
  529. TableOperation operation = TableOperation.Insert(entity);
  530. TableResult result = await tableClient.GetTableReference(TableName).ExecuteAsync(operation);
  531. return (T)result.Result;
  532. }
  533. public async Task<T> SaveOrUpdate<T>(TableEntity entity) where T : TableEntity, new()
  534. {
  535. string TableName = await InitializeTable<T>();
  536. TableOperation operation = TableOperation.InsertOrReplace(entity);
  537. TableResult result = await tableClient.GetTableReference(TableName).ExecuteAsync(operation);
  538. return (T)result.Result;
  539. }
  540. public async Task<T> Update<T>(TableEntity entity) where T : TableEntity, new()
  541. {
  542. string TableName = await InitializeTable<T>();
  543. TableOperation operation = TableOperation.Replace(entity);
  544. TableResult result = await tableClient.GetTableReference(TableName).ExecuteAsync(operation);
  545. return (T)result.Result;
  546. }
  547. public async Task<T> Delete<T>(TableEntity entity) where T : TableEntity, new()
  548. {
  549. string TableName = await InitializeTable<T>();
  550. TableOperation operation = TableOperation.Delete(entity);
  551. TableResult result = await tableClient.GetTableReference(TableName).ExecuteAsync(operation);
  552. return (T)result.Result;
  553. }
  554. //public async Task<List<T>> FindListByDictAndLike<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict) where T : TableEntity, new()
  555. //{
  556. // throw new NotImplementedException();
  557. //}
  558. //public async Task<List<T>> FindListByDictAndLikeAndNotEQ<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict, Dictionary<string, object> notEQDict) where T : TableEntity, new()
  559. //{
  560. // throw new NotImplementedException();
  561. //}
  562. //public async Task<List<T>> FindListByDictAndLikeAndStartWith<T>(Dictionary<string, object> dict, Dictionary<string, object> likeDict, Dictionary<string, object> startDict) where T : TableEntity, new()
  563. //{
  564. // throw new NotImplementedException();
  565. //}
  566. public async Task<AzurePagination<T>> FindListByDict<T>(Dictionary<string, object> dict, AzureTableToken azureTableToken) where T : TableEntity, new()
  567. {
  568. string TableName = await InitializeTable<T>();
  569. var exQuery = new TableQuery<T>();
  570. StringBuilder builder = new StringBuilder();
  571. if (null != dict && dict.Count > 0)
  572. {
  573. var keys = dict.Keys;
  574. int index = 1;
  575. foreach (string key in keys)
  576. {
  577. if (dict[key] != null && !string.IsNullOrEmpty(dict[key].ToString()))
  578. {
  579. string typeStr = SwitchType<T>(dict, key);
  580. if (index == 1)
  581. {
  582. // builder.Append(TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  583. builder.Append(typeStr);
  584. }
  585. else
  586. {
  587. builder.Append(" " + TableOperators.And + " " + typeStr);
  588. //builder.Append(" " + TableOperators.And + " " + TableQuery.GenerateFilterCondition(key, QueryComparisons.Equal, dict[key].ToString()));
  589. }
  590. index++;
  591. }
  592. else
  593. {
  594. throw new Exception("The parameter must have value!");
  595. }
  596. }
  597. exQuery.Where(builder.ToString());
  598. return await QueryList<T>(azureTableToken, exQuery, TableName);
  599. }
  600. else
  601. {
  602. return null;
  603. }
  604. }
  605. private async Task<AzurePagination<T>> QueryList<T>(AzureTableToken azureTableToken, TableQuery<T> exQuery, string TableName) where T : TableEntity, new()
  606. {
  607. TableContinuationToken tableToken = new HaBookTableContinuationToken(azureTableToken).GetContinuationToken();
  608. List<T> entitys = new List<T>();
  609. var result = await tableClient.GetTableReference(TableName).ExecuteQuerySegmentedAsync(exQuery, tableToken);
  610. if (result.Results.Count > 0)
  611. {
  612. entitys.AddRange(result.ToList());
  613. }
  614. tableToken = result.ContinuationToken;
  615. AzurePagination<T> pagination = new AzurePagination<T>
  616. {
  617. token = new HaBookTableContinuationToken(tableToken).GetAzureTableToken(),
  618. data = entitys
  619. };
  620. return pagination;
  621. }
  622. }
  623. }