RepositoryExtension.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. namespace Admin.NET.Core;
  2. public static class RepositoryExtension
  3. {
  4. /// <summary>
  5. /// 实体假删除 _rep.FakeDelete(entity)
  6. /// </summary>
  7. /// <typeparam name="T"></typeparam>
  8. /// <param name="repository"></param>
  9. /// <param name="entity"></param>
  10. /// <returns></returns>
  11. public static int FakeDelete<T>(this ISugarRepository repository, T entity) where T : EntityBase, new()
  12. {
  13. return repository.Context.FakeDelete(entity);
  14. }
  15. /// <summary>
  16. /// 实体假删除 db.FakeDelete(entity)
  17. /// </summary>
  18. /// <typeparam name="T"></typeparam>
  19. /// <param name="db"></param>
  20. /// <param name="entity"></param>
  21. /// <returns></returns>
  22. public static int FakeDelete<T>(this ISqlSugarClient db, T entity) where T : EntityBase, new()
  23. {
  24. return db.Updateable(entity).ReSetValue(x => { x.IsDelete = true; })
  25. .IgnoreColumns(ignoreAllNullColumns: true)
  26. .EnableDiffLogEvent() // 记录差异日志
  27. .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId
  28. .ExecuteCommand();
  29. }
  30. /// <summary>
  31. /// 实体假删除异步 _rep.FakeDeleteAsync(entity)
  32. /// </summary>
  33. /// <typeparam name="T"></typeparam>
  34. /// <param name="repository"></param>
  35. /// <param name="entity"></param>
  36. /// <returns></returns>
  37. public static Task<int> FakeDeleteAsync<T>(this ISugarRepository repository, T entity) where T : EntityBase, new()
  38. {
  39. return repository.Context.FakeDeleteAsync(entity);
  40. }
  41. /// <summary>
  42. /// 实体假删除 db.FakeDelete(entity)
  43. /// </summary>
  44. /// <typeparam name="T"></typeparam>
  45. /// <param name="db"></param>
  46. /// <param name="entity"></param>
  47. /// <returns></returns>
  48. public static Task<int> FakeDeleteAsync<T>(this ISqlSugarClient db, T entity) where T : EntityBase, new()
  49. {
  50. return db.Updateable(entity).ReSetValue(x => { x.IsDelete = true; })
  51. .IgnoreColumns(ignoreAllNullColumns: true)
  52. .EnableDiffLogEvent() // 记录差异日志
  53. .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId
  54. .ExecuteCommandAsync();
  55. }
  56. /// <summary>
  57. /// 排序方式(默认降序)
  58. /// </summary>
  59. /// <param name="queryable"></param>
  60. /// <param name="pageInput"> </param>
  61. /// <param name="defualtSortField"> 默认排序字段 </param>
  62. /// <param name="descSort"> 是否降序 </param>
  63. /// <returns> </returns>
  64. public static ISugarQueryable<T> OrderBuilder<T>(this ISugarQueryable<T> queryable, BasePageInput pageInput, string defualtSortField = "Id", bool descSort = true)
  65. {
  66. var orderStr = "";
  67. // 约定默认每张表都有Id排序
  68. if (!string.IsNullOrWhiteSpace(defualtSortField))
  69. {
  70. orderStr = descSort ? defualtSortField + " Desc" : defualtSortField + " Asc";
  71. }
  72. TypeAdapterConfig config = new();
  73. config.ForType<T, BasePageInput>().IgnoreNullValues(true);
  74. Mapper mapper = new(config); // 务必将mapper设为单实例
  75. var nowPagerInput = mapper.Map<BasePageInput>(pageInput);
  76. // 排序是否可用-排序字段和排序顺序都为非空才启用排序
  77. if (!string.IsNullOrEmpty(nowPagerInput.Field) && !string.IsNullOrEmpty(nowPagerInput.Order))
  78. {
  79. orderStr = $"{nowPagerInput.Field} {(nowPagerInput.Order == nowPagerInput.DescStr ? "Desc" : "Asc")}";
  80. }
  81. return queryable.OrderByIF(!string.IsNullOrWhiteSpace(orderStr), orderStr);
  82. }
  83. /// <summary>
  84. /// 更新实体并记录差异日志 _rep.UpdateWithDiffLog(entity)
  85. /// </summary>
  86. /// <typeparam name="T"></typeparam>
  87. /// <param name="repository"></param>
  88. /// <param name="entity"></param>
  89. /// <param name="ignoreAllNullColumns"></param>
  90. /// <returns></returns>
  91. public static int UpdateWithDiffLog<T>(this ISugarRepository repository, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new()
  92. {
  93. return repository.Context.UpdateWithDiffLog(entity, ignoreAllNullColumns);
  94. }
  95. /// <summary>
  96. /// 更新实体并记录差异日志 _rep.UpdateWithDiffLog(entity)
  97. /// </summary>
  98. /// <typeparam name="T"></typeparam>
  99. /// <param name="db"></param>
  100. /// <param name="entity"></param>
  101. /// <param name="ignoreAllNullColumns"></param>
  102. /// <returns></returns>
  103. public static int UpdateWithDiffLog<T>(this ISqlSugarClient db, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new()
  104. {
  105. return db.Updateable(entity)
  106. .IgnoreColumns(ignoreAllNullColumns: ignoreAllNullColumns)
  107. .EnableDiffLogEvent()
  108. .ExecuteCommand();
  109. }
  110. /// <summary>
  111. /// 更新实体并记录差异日志 _rep.UpdateWithDiffLogAsync(entity)
  112. /// </summary>
  113. /// <typeparam name="T"></typeparam>
  114. /// <param name="repository"></param>
  115. /// <param name="entity"></param>
  116. /// <param name="ignoreAllNullColumns"></param>
  117. /// <returns></returns>
  118. public static Task<int> UpdateWithDiffLogAsync<T>(this ISugarRepository repository, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new()
  119. {
  120. return repository.Context.UpdateWithDiffLogAsync(entity, ignoreAllNullColumns);
  121. }
  122. /// <summary>
  123. /// 更新实体并记录差异日志 _rep.UpdateWithDiffLogAsync(entity)
  124. /// </summary>
  125. /// <typeparam name="T"></typeparam>
  126. /// <param name="db"></param>
  127. /// <param name="entity"></param>
  128. /// <param name="ignoreAllNullColumns"></param>
  129. /// <returns></returns>
  130. public static Task<int> UpdateWithDiffLogAsync<T>(this ISqlSugarClient db, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new()
  131. {
  132. return db.Updateable(entity)
  133. .IgnoreColumns(ignoreAllNullColumns: ignoreAllNullColumns)
  134. .EnableDiffLogEvent()
  135. .ExecuteCommandAsync();
  136. }
  137. /// <summary>
  138. /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity)
  139. /// </summary>
  140. /// <typeparam name="T"></typeparam>
  141. /// <param name="repository"></param>
  142. /// <param name="entity"></param>
  143. /// <returns></returns>
  144. public static int InsertWithDiffLog<T>(this ISugarRepository repository, T entity) where T : EntityBase, new()
  145. {
  146. return repository.Context.InsertWithDiffLog(entity);
  147. }
  148. /// <summary>
  149. /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity)
  150. /// </summary>
  151. /// <typeparam name="T"></typeparam>
  152. /// <param name="db"></param>
  153. /// <param name="entity"></param>
  154. /// <returns></returns>
  155. public static int InsertWithDiffLog<T>(this ISqlSugarClient db, T entity) where T : EntityBase, new()
  156. {
  157. return db.Insertable(entity).EnableDiffLogEvent().ExecuteCommand();
  158. }
  159. /// <summary>
  160. /// 新增实体并记录差异日志 _rep.InsertWithDiffLogAsync(entity)
  161. /// </summary>
  162. /// <typeparam name="T"></typeparam>
  163. /// <param name="repository"></param>
  164. /// <param name="entity"></param>
  165. /// <returns></returns>
  166. public static Task<int> InsertWithDiffLogAsync<T>(this ISugarRepository repository, T entity) where T : EntityBase, new()
  167. {
  168. return repository.Context.InsertWithDiffLogAsync(entity);
  169. }
  170. /// <summary>
  171. /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity)
  172. /// </summary>
  173. /// <typeparam name="T"></typeparam>
  174. /// <param name="db"></param>
  175. /// <param name="entity"></param>
  176. /// <returns></returns>
  177. public static Task<int> InsertWithDiffLogAsync<T>(this ISqlSugarClient db, T entity) where T : EntityBase, new()
  178. {
  179. return db.Insertable(entity).EnableDiffLogEvent().ExecuteCommandAsync();
  180. }
  181. /// <summary>
  182. /// 多库查询
  183. /// </summary>
  184. /// <param name="queryable"></param>
  185. /// <returns> </returns>
  186. public static ISugarQueryable<T> AS<T>(this ISugarQueryable<T> queryable)
  187. {
  188. return queryable.AS<T>(GetTableName<T>(queryable.Context.Ado));
  189. }
  190. /// <summary>
  191. /// 多库查询
  192. /// </summary>
  193. /// <typeparam name="T"></typeparam>
  194. /// <typeparam name="T2"></typeparam>
  195. /// <param name="queryable"></param>
  196. /// <returns></returns>
  197. public static ISugarQueryable<T, T2> AS<T, T2>(this ISugarQueryable<T, T2> queryable)
  198. {
  199. return queryable.AS<T2>(GetTableName<T2>(queryable.Context.Ado));
  200. }
  201. /// <summary>
  202. /// 根据实体类型获取表信息
  203. /// </summary>
  204. /// <typeparam name="T"></typeparam>
  205. /// <returns></returns>
  206. private static string GetTableName<T>(IAdo ado)
  207. {
  208. var entityType = typeof(T);
  209. var attr = entityType.GetCustomAttribute<TenantAttribute>();
  210. var configId = attr == null ? SqlSugarConst.ConfigId : attr.configId.ToString();
  211. var tableName = entityType.GetCustomAttribute<SugarTable>().TableName;
  212. //根据实际的数据库类型 修改此处 如果固定使用一个数据库,可用直接写死
  213. var wholeTableName = $"{configId}.dbo.{tableName}";
  214. if (ado is MySqlProvider)
  215. {
  216. wholeTableName = $"{configId}.{tableName}";
  217. }
  218. else if (ado is SqlServerProvider)
  219. {
  220. wholeTableName = $"{configId}.dbo.{tableName}";
  221. }
  222. return wholeTableName;
  223. }
  224. }