using System.Reflection; using Common.Const; using Entity.Base; using Entity.Dto.Req; using HybirdFrameworkCore.Entity; using Mapster; using MapsterMapper; using SqlSugar; namespace Repository { public static class RepositoryExtension { /// /// 实体假删除 _rep.FakeDelete(entity) /// /// /// /// /// public static int FakeDelete(this ISugarRepository repository, T entity) where T : EntityBase, new() { return repository.Context.FakeDelete(entity); } /// /// 实体假删除 db.FakeDelete(entity) /// /// /// /// /// public static int FakeDelete(this ISqlSugarClient db, T entity) where T : EntityBase, new() { return db.Updateable(entity).AS().ReSetValue(x => { x.IsDelete = true; }) .IgnoreColumns(ignoreAllNullColumns: true) .EnableDiffLogEvent() // 记录差异日志 .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId .ExecuteCommand(); } /// /// 实体集合批量假删除 _rep.FakeDelete(entity) /// /// /// /// /// public static int FakeDelete(this ISugarRepository repository, List entity) where T : EntityBase, new() { return repository.Context.FakeDelete(entity); } /// /// 实体集合批量假删除 db.FakeDelete(entity) /// /// /// /// /// public static int FakeDelete(this ISqlSugarClient db, List entity) where T : EntityBase, new() { return db.Updateable(entity).AS().ReSetValue(x => { x.IsDelete = true; }) .IgnoreColumns(ignoreAllNullColumns: true) .EnableDiffLogEvent() // 记录差异日志 .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId .ExecuteCommand(); } /// /// 实体假删除异步 _rep.FakeDeleteAsync(entity) /// /// /// /// /// public static Task FakeDeleteAsync(this ISugarRepository repository, T entity) where T : EntityBase, new() { return repository.Context.FakeDeleteAsync(entity); } /// /// 实体假删除 db.FakeDelete(entity) /// /// /// /// /// public static Task FakeDeleteAsync(this ISqlSugarClient db, T entity) where T : EntityBase, new() { return db.Updateable(entity).AS().ReSetValue(x => { x.IsDelete = true; }) .IgnoreColumns(ignoreAllNullColumns: true) .EnableDiffLogEvent() // 记录差异日志 .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId .ExecuteCommandAsync(); } /// /// 实体集合批量假删除异步 _rep.FakeDeleteAsync(entity) /// /// /// /// /// public static Task FakeDeleteAsync(this ISugarRepository repository, List entity) where T : EntityBase, new() { return repository.Context.FakeDeleteAsync(entity); } /// /// 实体集合批量假删除 db.FakeDelete(entity) /// /// /// /// /// public static Task FakeDeleteAsync(this ISqlSugarClient db, List entity) where T : EntityBase, new() { return db.Updateable(entity).AS().ReSetValue(x => { x.IsDelete = true; }) .IgnoreColumns(ignoreAllNullColumns: true) .EnableDiffLogEvent() // 记录差异日志 .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId .ExecuteCommandAsync(); } /// /// 排序方式(默认降序) /// /// /// /// /// 默认排序字段 /// 是否降序 /// public static ISugarQueryable OrderBuilder(this ISugarQueryable queryable, QueryPageModel pageInput, string prefix = "", string defaultSortField = "Id", bool descSort = true) { // 约定默认每张表都有Id排序 var orderStr = string.IsNullOrWhiteSpace(defaultSortField) ? "" : $"{prefix}{defaultSortField}" + (descSort ? " Desc" : " Asc"); return queryable.OrderByIF(!string.IsNullOrWhiteSpace(orderStr), orderStr); } /// /// 更新实体并记录差异日志 _rep.UpdateWithDiffLog(entity) /// /// /// /// /// /// public static int UpdateWithDiffLog(this ISugarRepository repository, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new() { return repository.Context.UpdateWithDiffLog(entity, ignoreAllNullColumns); } /// /// 更新实体并记录差异日志 _rep.UpdateWithDiffLog(entity) /// /// /// /// /// /// public static int UpdateWithDiffLog(this ISqlSugarClient db, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new() { return db.Updateable(entity).AS() .IgnoreColumns(ignoreAllNullColumns: ignoreAllNullColumns) .EnableDiffLogEvent() .ExecuteCommand(); } /// /// 更新实体并记录差异日志 _rep.UpdateWithDiffLogAsync(entity) /// /// /// /// /// /// public static Task UpdateWithDiffLogAsync(this ISugarRepository repository, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new() { return repository.Context.UpdateWithDiffLogAsync(entity, ignoreAllNullColumns); } /// /// 更新实体并记录差异日志 _rep.UpdateWithDiffLogAsync(entity) /// /// /// /// /// /// public static Task UpdateWithDiffLogAsync(this ISqlSugarClient db, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new() { return db.Updateable(entity) .IgnoreColumns(ignoreAllNullColumns: ignoreAllNullColumns) .EnableDiffLogEvent() .ExecuteCommandAsync(); } /// /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity) /// /// /// /// /// public static int InsertWithDiffLog(this ISugarRepository repository, T entity) where T : EntityBase, new() { return repository.Context.InsertWithDiffLog(entity); } /// /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity) /// /// /// /// /// public static int InsertWithDiffLog(this ISqlSugarClient db, T entity) where T : EntityBase, new() { return db.Insertable(entity).AS().EnableDiffLogEvent().ExecuteCommand(); } /// /// 新增实体并记录差异日志 _rep.InsertWithDiffLogAsync(entity) /// /// /// /// /// public static Task InsertWithDiffLogAsync(this ISugarRepository repository, T entity) where T : EntityBase, new() { return repository.Context.InsertWithDiffLogAsync(entity); } /// /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity) /// /// /// /// /// public static Task InsertWithDiffLogAsync(this ISqlSugarClient db, T entity) where T : EntityBase, new() { return db.Insertable(entity).AS().EnableDiffLogEvent().ExecuteCommandAsync(); } /// /// 多库查询 /// /// /// public static ISugarQueryable AS(this ISugarQueryable queryable) { var info = GetTableInfo(); return queryable.AS($"{info.Item1}.{info.Item2}"); } /// /// 多库查询 /// /// /// /// /// public static ISugarQueryable AS(this ISugarQueryable queryable) { var info = GetTableInfo(); return queryable.AS($"{info.Item1}.{info.Item2}"); } /// /// 多库更新 /// /// /// public static IUpdateable AS(this IUpdateable updateable) where T : EntityBase, new() { var info = GetTableInfo(); return updateable.AS($"{info.Item1}.{info.Item2}"); } /// /// 多库新增 /// /// /// public static IInsertable AS(this IInsertable insertable) where T : EntityBase, new() { var info = GetTableInfo(); return insertable.AS($"{info.Item1}.{info.Item2}"); } /// /// 多库删除 /// /// /// public static IDeleteable AS(this IDeleteable deleteable) where T : EntityBase, new() { var info = GetTableInfo(); return deleteable.AS($"{info.Item1}.{info.Item2}"); } /// /// 根据实体类型获取表信息 /// /// /// private static Tuple GetTableInfo() { var entityType = typeof(T); var attr = entityType.GetCustomAttribute(); var configId = attr == null ? SqlSugarConst.MainConfigId : attr.configId.ToString(); var tableName = entityType.GetCustomAttribute().TableName; return new Tuple(configId, tableName); } /// /// 禁用过滤器-适用于更新和删除操作(只对当前请求有效,禁止使用异步) /// /// /// 禁止异步 /// public static void RunWithoutFilter(this ISugarRepository repository, Action action) { repository.Context.QueryFilter.ClearAndBackup(); // 清空并备份过滤器 action.Invoke(); repository.Context.QueryFilter.Restore(); // 还原过滤器 // 用例 //_rep.RunWithoutFilter(() => //{ // 执行更新或者删除 // 禁止使用异步函数 //}); } /// /// 忽略租户 /// /// /// 是否忽略 默认true /// public static ISugarQueryable IgnoreTenant(this ISugarQueryable queryable, bool ignore = true) { return ignore ? queryable.ClearFilter() : queryable; } /// /// 导航+子表过滤 创建一个扩展函数,默认是Class不支持Where /// /// /// /// /// public static List Where(this T thisValue, Func whereExpression) where T : class, new() { return new List() { thisValue }; } /// /// 导航+子表过滤 创建一个扩展函数,默认是Class不支持WhereIF /// /// /// /// /// /// public static List WhereIF(this T thisValue, bool isWhere, Func whereExpression) where T : class, new() { return new List() { thisValue }; } /// /// 只更新某些列 /// /// /// /// /// public static IUpdateable OnlyUpdateColumn(this IUpdateable updateable) where T : EntityBase, new() where R : class, new() { if (updateable.UpdateBuilder.UpdateColumns == null) updateable.UpdateBuilder.UpdateColumns = new List(); foreach (PropertyInfo info in typeof(R).GetProperties()) { // 判断是否是相同属性 if (typeof(T).GetProperty(info.Name) != null) updateable.UpdateBuilder.UpdateColumns.Add(info.Name); } return updateable; } } }