颐和api

BaseRepository.cs 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. using MadRunFabric.Common.DbContext;
  2. using MadRunFabric.Common.Options;
  3. using Microsoft.Extensions.Logging;
  4. using Microsoft.Extensions.Options;
  5. using MongoDB.Bson;
  6. using MongoDB.Driver;
  7. using System;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using System.Linq.Expressions;
  11. using System.Reflection;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. namespace MadRunFabric.Common
  15. {
  16. public abstract class BaseRepository<T, TKey> : IRepository<T, TKey> where T : class, IBaseModel<TKey>
  17. {
  18. private readonly ILogger<BaseRepository<T, TKey>> _logger;
  19. protected BaseContext _context;
  20. protected readonly IMongoCollection<T> _collection;
  21. public BaseRepository(IOptions<MongodbOptions> settings, ILogger<BaseRepository<T, TKey>> logger)
  22. {
  23. _logger = logger;
  24. _context = new BaseContext(settings);
  25. _collection = _context.GetCollection<T>();//获取集合
  26. }
  27. /// <summary>
  28. /// 异步添加一条数据
  29. /// </summary>
  30. /// <param name="entity"></param>
  31. /// <returns></returns>
  32. public async Task<bool> Add(T entity)
  33. {
  34. try
  35. {
  36. await _collection.InsertOneAsync(entity);
  37. return true;
  38. }
  39. catch (Exception ex)
  40. {
  41. _logger.LogError(ex.ToString());
  42. return false;
  43. }
  44. }
  45. /// <summary>
  46. /// 异步添加多条数据
  47. /// </summary>
  48. /// <param name="entitys"></param>
  49. /// <returns></returns>
  50. public async Task<bool> AddRange(List<T> entitys)
  51. {
  52. try
  53. {
  54. await _collection.InsertManyAsync(entitys);
  55. return true;
  56. }
  57. catch (Exception ex)
  58. {
  59. _logger.LogError(ex.ToString());
  60. return false;
  61. }
  62. }
  63. /// <summary>
  64. /// 获取数量
  65. /// </summary>
  66. /// <param name="where"></param>
  67. /// <returns></returns>
  68. public async Task<long> Count(Expression<Func<T, bool>> @where = null)
  69. {
  70. try
  71. {
  72. return await _collection.CountAsync(@where);
  73. }
  74. catch (Exception ex)
  75. {
  76. _logger.LogError(ex.ToString());
  77. throw ex;
  78. }
  79. }
  80. public void Dispose()
  81. {
  82. throw new NotImplementedException();
  83. }
  84. /// <summary>
  85. /// 依据条件查询数据
  86. /// </summary>
  87. /// <param name="expression"></param>
  88. /// <returns></returns>
  89. public async Task<IEnumerable<T>> Get(Expression<Func<T, bool>> @where = null)
  90. {
  91. try
  92. {
  93. var task = await _collection.FindAsync(@where);
  94. return task.ToList();
  95. }
  96. catch (Exception ex)
  97. {
  98. _logger.LogError(ex.ToString());
  99. throw ex;
  100. }
  101. }
  102. /// <summary>
  103. /// 依据查询条件查询所有数据 包含显示字段 排序
  104. /// </summary>
  105. /// <param name="filter"></param>
  106. /// <param name="field"></param>
  107. /// <param name="sort"></param>
  108. /// <returns></returns>
  109. public async Task<IEnumerable<T>> Get(FilterDefinition<T> filter, string[] field = null, SortDefinition<T> sort = null)
  110. {
  111. try
  112. {
  113. //不指定查询字段
  114. if (field == null || field.Length == 0)
  115. {
  116. if (filter == null)
  117. {
  118. if (sort == null) return await _collection.Find(_ => true).ToListAsync();
  119. //进行排序
  120. return await _collection.Find(_ => true).Sort(sort).ToListAsync();
  121. }
  122. if (sort == null) return await _collection.Find(filter).ToListAsync();
  123. //进行排序
  124. return await _collection.Find(filter).Sort(sort).ToListAsync();
  125. }
  126. #region 指定查询字段
  127. //指定查询字段
  128. var fieldList = new List<ProjectionDefinition<T>>();
  129. for (int i = 0; i < field.Length; i++)
  130. {
  131. fieldList.Add(Builders<T>.Projection.Include(field[i].ToString()));
  132. }
  133. var projection = Builders<T>.Projection.Combine(fieldList);
  134. fieldList?.Clear();
  135. if (sort == null) return await _collection.Find(filter).Project<T>(projection).ToListAsync();
  136. //排序查询
  137. return await _collection.Find(filter).Sort(sort).Project<T>(projection).ToListAsync();
  138. #endregion
  139. }
  140. catch (Exception ex)
  141. {
  142. _logger.LogError(ex.ToString());
  143. throw ex;
  144. }
  145. }
  146. /// <summary>
  147. /// 查询所有数据
  148. /// </summary>
  149. /// <returns></returns>
  150. public async Task<IEnumerable<T>> GetAll()
  151. {
  152. try
  153. {
  154. return await _collection.Find(_ => true).ToListAsync();
  155. }
  156. catch (Exception ex)
  157. {
  158. _logger.LogError(ex.ToString());
  159. throw ex;
  160. }
  161. }
  162. /// <summary>
  163. /// 分页查询数据列表
  164. /// </summary>
  165. /// <param name="filter"></param>
  166. /// <param name="pageIndex"></param>
  167. /// <param name="pageSize"></param>
  168. /// <param name="sort"></param>
  169. /// <returns></returns>
  170. public async Task<IEnumerable<T>> GetByPage(FilterDefinition<T> filter, int pageIndex, int pageSize, SortDefinition<T> sort = null)
  171. {
  172. try
  173. {
  174. //没有查询条件
  175. if (filter == null)
  176. {
  177. if (sort == null)
  178. return await _collection.Find(_ => true).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync();
  179. //排序
  180. return await _collection.Find(_ => true).Sort(sort).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync();
  181. }
  182. if (sort == null) return await _collection.Find(filter).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync();
  183. //排序
  184. return await _collection.Find(filter).Sort(sort).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync();
  185. }
  186. catch (Exception ex)
  187. {
  188. _logger.LogError(ex.ToString());
  189. throw ex;
  190. }
  191. }
  192. /// <summary>
  193. /// 查询一条数据
  194. /// </summary>
  195. /// <param name="key"></param>
  196. /// <returns></returns>
  197. public async Task<T> GetSingle(TKey key)
  198. {
  199. var filter = Builders<T>.Filter.Eq("id", key);
  200. try
  201. {
  202. return await _collection.Find(filter).FirstOrDefaultAsync();
  203. }
  204. catch (Exception ex)
  205. {
  206. _logger.LogError(ex.ToString());
  207. throw ex;
  208. }
  209. }
  210. /// <summary>
  211. /// 根据查询条件查出
  212. /// </summary>
  213. /// <param name="where"></param>
  214. /// <returns></returns>
  215. public async Task<T> GetSingle(Expression<Func<T, bool>> @where = null)
  216. {
  217. try
  218. {
  219. return await _collection.Find(@where).FirstOrDefaultAsync();
  220. }
  221. catch (Exception ex)
  222. {
  223. _logger.LogError(ex.ToString());
  224. throw ex;
  225. }
  226. }
  227. /// <summary>
  228. /// 查询一条数据 条件 排序
  229. /// </summary>
  230. /// <param name="where"></param>
  231. /// <returns></returns>
  232. public async Task<T> GetSingle(Expression<Func<T, bool>> @where = null, SortDefinition<T> sort = null)
  233. {
  234. try
  235. {
  236. if (sort == null)
  237. return await _collection.Find(@where).FirstOrDefaultAsync();
  238. return await _collection.Find(@where).Sort(sort).FirstOrDefaultAsync();
  239. }
  240. catch (Exception ex)
  241. {
  242. _logger.LogError(ex.ToString());
  243. throw ex;
  244. }
  245. }
  246. /// <summary>
  247. /// 删除一项 根据id
  248. /// </summary>
  249. /// <param name="key"></param>
  250. /// <returns></returns>
  251. public async Task<bool> Remove(TKey key)
  252. {
  253. try
  254. {
  255. DeleteResult actionResult = await _collection.DeleteOneAsync(Builders<T>.Filter.Eq("id", key));
  256. return actionResult.IsAcknowledged && actionResult.DeletedCount > 0;
  257. }
  258. catch (Exception ex)
  259. {
  260. _logger.LogError(ex.ToString());
  261. throw ex;
  262. }
  263. }
  264. /// <summary>
  265. /// 依据条件删除多项
  266. /// </summary>
  267. /// <param name="where"></param>
  268. /// <returns></returns>
  269. public async Task<bool> Remove(Expression<Func<T, bool>> @where = null)
  270. {
  271. try
  272. {
  273. DeleteResult actionResult = await _collection.DeleteManyAsync(@where);
  274. return actionResult.IsAcknowledged && actionResult.DeletedCount > 0;
  275. }
  276. catch (Exception ex)
  277. {
  278. _logger.LogError(ex.ToString());
  279. throw ex;
  280. }
  281. }
  282. /// <summary>
  283. /// 删除所有数据
  284. /// </summary>
  285. /// <returns></returns>
  286. public async Task<bool> RemoveAll()
  287. {
  288. try
  289. {
  290. DeleteResult actionResult = await _collection.DeleteManyAsync(new BsonDocument());
  291. return actionResult.IsAcknowledged
  292. && actionResult.DeletedCount > 0;
  293. }
  294. catch (Exception ex)
  295. {
  296. _logger.LogError(ex.ToString());
  297. return false;
  298. }
  299. }
  300. /// <summary>
  301. /// 修改数据
  302. /// </summary>
  303. /// <param name="entity"></param>
  304. /// <returns></returns>
  305. public async Task<bool> Update(T entity)
  306. {
  307. try
  308. {
  309. //修改条件
  310. FilterDefinition<T> filter = Builders<T>.Filter.Eq("id", entity.id);
  311. //要修改的字段
  312. var list = new List<UpdateDefinition<T>>();
  313. foreach (var item in entity.GetType().GetProperties())
  314. {
  315. if (item.Name.ToLower() == "id") continue;
  316. list.Add(Builders<T>.Update.Set(item.Name, item.GetValue(entity)));
  317. }
  318. var updatefilter = Builders<T>.Update.Combine(list);
  319. var r = await _collection.UpdateOneAsync(filter, updatefilter, null);
  320. //return r.IsAcknowledged && r.ModifiedCount > 0;
  321. return r.IsAcknowledged ;
  322. }
  323. catch (Exception ex)
  324. {
  325. _logger.LogError(ex.ToString());
  326. return false;
  327. }
  328. }
  329. public async Task<bool> Update(string id, Dictionary<object, object> dic)
  330. {
  331. try
  332. {
  333. //修改条件
  334. FilterDefinition<T> filter = Builders<T>.Filter.Eq("_id", new ObjectId(id));
  335. //要修改的字段
  336. var list = new List<UpdateDefinition<T>>();
  337. foreach (var item in dic)
  338. {
  339. list.Add(Builders<T>.Update.Set(item.Key.ToString(), item.Value));
  340. }
  341. var updatefilter = Builders<T>.Update.Combine(list);
  342. var r = await _collection.UpdateOneAsync(filter, updatefilter, null);
  343. //return r.IsAcknowledged && r.ModifiedCount > 0;
  344. return r.IsAcknowledged;
  345. }
  346. catch (Exception ex)
  347. {
  348. _logger.LogError(ex.ToString());
  349. return false;
  350. }
  351. }
  352. public async Task<bool> UpdateOne(T entity)
  353. {
  354. try
  355. {
  356. //修改条件
  357. FilterDefinition<T> filter = Builders<T>.Filter.Eq("id", entity.id);
  358. var query = await _collection.Find(filter).FirstOrDefaultAsync();
  359. //要修改的字段
  360. var list = new List<UpdateDefinition<T>>();
  361. //要删除的字段
  362. var dellist = new List<UpdateDefinition<T>>();
  363. foreach (var property in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public))
  364. {
  365. //非空的复杂类型
  366. if (property.PropertyType.IsClass && property.PropertyType != typeof(string) && property.GetValue(entity) != null)
  367. {
  368. var subarray = property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
  369. if (typeof(IList).IsAssignableFrom(property.PropertyType))
  370. {
  371. #region 集合类型
  372. foreach (var sub in subarray)
  373. {
  374. //if (sub.PropertyType.IsClass && sub.PropertyType != typeof(string))
  375. if (sub.PropertyType.IsClass)
  376. {
  377. //var arr = property.GetValue(entity) as IList;
  378. //var arrold = property.GetValue(query) as IList;
  379. var enumobj = property.GetValue(entity) as IEnumerable<object>;
  380. //var enumoldobj = property.GetValue(query) as IEnumerable<object>;
  381. dellist.Add(Builders<T>.Update.Unset(property.Name));
  382. list.Add(Builders<T>.Update.PushEach(property.Name, enumobj));
  383. //if (sub.PropertyType != typeof(string))
  384. //{
  385. // var subinnerarray = sub.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
  386. // if (arr != null && arr.Count > 0)
  387. // {
  388. // for (int s = 0; s < arr.Count; s++)
  389. // {
  390. // foreach (var subInner in subinnerarray)
  391. // {
  392. // //propertyName.index.innerPropertyName
  393. // list.Add(Builders<T>.Update.Set(property.Name + "." + s + "." + subInner.Name, subInner.GetValue(arr[s])));
  394. // }
  395. // }
  396. // }
  397. // int n = 0;
  398. // if (arr != null) { n = arr.Count; }
  399. // int o = 0;
  400. // if (arrold != null) { o = arrold.Count; }
  401. // if (o > n)
  402. // {
  403. // for (int i = n; i < arrold.Count; i++)
  404. // {
  405. // switch (sub.PropertyType.Name)
  406. // {
  407. // case "ExtensionModel":
  408. // FilterDefinition<ExtensionModel> subfilterexten = Builders<ExtensionModel>.Filter.Eq(subinnerarray[0].Name, subinnerarray[0].GetValue(arrold[i]));
  409. // dellist.Add(Builders<T>.Update.PullFilter(property.Name, subfilterexten));
  410. // break;
  411. // case "FileBaseModel":
  412. // FilterDefinition<FileBaseModel> subfilterfile = Builders<FileBaseModel>.Filter.Eq(subinnerarray[0].Name, subinnerarray[0].GetValue(arrold[i]));
  413. // dellist.Add(Builders<T>.Update.PullFilter(property.Name, subfilterfile));
  414. // break;
  415. // case "MaterialModel":
  416. // FilterDefinition<MaterialModel> subfiltermater = Builders<MaterialModel>.Filter.Eq(subinnerarray[0].Name, subinnerarray[0].GetValue(arrold[i]));
  417. // dellist.Add(Builders<T>.Update.PullFilter(property.Name, subfiltermater));
  418. // break;
  419. // }
  420. // }
  421. // }
  422. //}
  423. //else
  424. //{
  425. // dellist.Add(Builders<T>.Update.PullAll(property.Name, enumoldobj));
  426. // list.Add(Builders<T>.Update.PushEach(property.Name, enumobj));
  427. //}
  428. }
  429. }
  430. #endregion
  431. }
  432. else
  433. {
  434. #region 实体类型
  435. //复杂类型,导航属性,类对象和集合对象
  436. foreach (var sub in subarray)
  437. {
  438. list.Add(Builders<T>.Update.Set(property.Name + "." + sub.Name, sub.GetValue(property.GetValue(entity))));
  439. }
  440. #endregion
  441. }
  442. }
  443. else
  444. {
  445. if (property.Name.ToLower() != "id")//更新集中不能有实体键_id
  446. {
  447. list.Add(Builders<T>.Update.Set(property.Name, property.GetValue(entity)));
  448. }
  449. }
  450. }
  451. if (dellist.Count > 0)
  452. {
  453. var delfilter = Builders<T>.Update.Combine(dellist);
  454. var d = await _collection.UpdateOneAsync(filter, delfilter, null);
  455. }
  456. var updatefilter = Builders<T>.Update.Combine(list);
  457. var r = await _collection.UpdateOneAsync(filter, updatefilter, null);
  458. //return r.IsAcknowledged && r.ModifiedCount > 0;
  459. return r.IsAcknowledged;
  460. }
  461. catch (Exception ex)
  462. {
  463. _logger.LogError(ex.ToString());
  464. return false;
  465. }
  466. }
  467. /// <summary>
  468. /// 批量修改数据
  469. /// </summary>
  470. public async Task<bool> UpdateManay(T entity, Dictionary<string, string> dic, FilterDefinition<T> filter = null)
  471. {
  472. try
  473. {
  474. //要修改的字段
  475. var list = new List<UpdateDefinition<T>>();
  476. foreach (var item in entity.GetType().GetProperties())
  477. {
  478. if (!dic.ContainsKey(item.Name)) continue;
  479. var value = dic[item.Name];
  480. list.Add(Builders<T>.Update.Set(item.Name, value));
  481. }
  482. var updatefilter = Builders<T>.Update.Combine(list);
  483. var r = await _collection.UpdateManyAsync(filter, updatefilter);
  484. return r.IsAcknowledged && r.ModifiedCount > 0;
  485. }
  486. catch (Exception ex)
  487. {
  488. _logger.LogError(ex.ToString());
  489. return false;
  490. }
  491. }
  492. /// <summary>
  493. /// 异步根据条件获取总数
  494. /// </summary>
  495. /// <param name="filter">条件</param>
  496. /// <returns></returns>
  497. public async Task<long> CountAsync(FilterDefinition<T> filter = null)
  498. {
  499. try
  500. {
  501. return await _collection.CountAsync(filter == null ? FilterDefinition<T>.Empty : filter);
  502. }
  503. catch (Exception ex)
  504. {
  505. _logger.LogError(ex.ToString());
  506. return 0;
  507. }
  508. }
  509. /// <summary>
  510. /// 异步添加一条数据并返回ID
  511. /// </summary>
  512. /// <param name="entity"></param>
  513. /// <returns></returns>
  514. public async Task<string> AddRetID(T entity)
  515. {
  516. try
  517. {
  518. await _collection.InsertOneAsync(entity);
  519. return entity.id.ToString();
  520. }
  521. catch (Exception ex)
  522. {
  523. _logger.LogError(ex.ToString());
  524. return null;
  525. }
  526. }
  527. }
  528. }