AzureTableDBRepository.cs 28 KB

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