using Mapster; using Microsoft.Extensions.Logging; using QYZH.InteractiveMagazine.Infrastructure.Context; using QYZH.InteractiveMagazine.Models.Dto; using SqlSugar; using SqlSugar.IOC; using System.Data; using System.Linq.Expressions; namespace QYZH.InteractiveMagazine.Repository { /// /// 数据仓库类 /// /// public class BaseRepository : SimpleClient where T : class, new() { private readonly ILogger> _logger; public BaseRepository(ISqlSugarClient context = null) : base(context) { Context = DbScoped.SugarScope; _logger = ServiceContext.GetService>>(); } #region add public IInsertable Insertable(T t) { return Context.Insertable(t); } #endregion add #region update public IUpdateable Updateable(T t) { return Context.Updateable(t); } public IUpdateable Updateable() { return Context.Updateable(); } public IUpdateable Updateable() where T1 : class, new() { return Context.Updateable(); } /// /// 根据指定条件更新指定列 eg:Update(new SysUser(){ Status = 1 }, it => new { it.Status }, f => f.Userid == 1)); /// 只更新Status列,条件是包含 /// /// 实体类 /// 要更新列的表达式 /// where表达式 /// public async Task UpdateAsync(Expression> columns, Expression> where) { return await Context.Updateable().SetColumns(columns).Where(where).ExecuteCommandAsync() > 0; } #endregion update /// /// 事务 异步 无返回值 /// /// /// public async Task UseTranAsync(Func action) { Context.Ado.BeginTran();//using不能少 try { await action(); Context.Ado.CommitTran(); } catch (Exception ex) { Context.Ado.RollbackTran(); _logger.LogError($"UseTran 异常:{ex.StackTrace},{ex.Message}"); throw; } } /// /// 事务 异步 返回bool /// /// /// public async Task UseTranAsync(Func> action) { Context.Ado.BeginTran();//using不能少 try { var result = await action(); if (result) { Context.Ado.CommitTran(); return true; } else { Context.Ado.RollbackTran(); return false; } } catch (Exception ex) { Context.Ado.RollbackTran(); _logger.LogError($"UseTran 异常:{ex.StackTrace},{ex.Message}"); throw; } } #region delete public IDeleteable Deleteable() { return Context.Deleteable(); } #endregion delete #region query public bool Any(Expression> expression) { return Context.Queryable().Any(expression); } public ISugarQueryable Queryable() { return Context.Queryable(); } public ISugarQueryable Queryable() { return Context.Queryable(); } /// /// 根据条件表达式查询单条数据 /// /// 表达式 /// 泛型实体 public Task GetByIdAsync(Expression> expression) where R : class { return Context.Queryable().Where(expression).Select().FirstAsync(); } public Task GetByExpressionAsync(Expression> expression) where R : class { return Context.Queryable().Where(expression).Select().FirstAsync(); } public Task> GetListByExpression(Expression> expression) where T2 : class { return Context.Queryable().Where(expression).Select().ToListAsync(); } /// /// 根据条件查询分页数据 /// /// /// /// public PageListModel GetPages(Expression> where, PageQueryModel parm) { var source = Context.Queryable().Where(where); return source.ToPage(parm); } /// /// 分页获取数据 /// /// 条件表达式 /// /// /// /// public PageListModel GetPages(Expression> where, PageQueryModel parm, Expression> order, OrderByType orderEnum = OrderByType.Asc) { var source = Context .Queryable() .Where(where) .OrderByIF(orderEnum == OrderByType.Asc, order, OrderByType.Asc) .OrderByIF(orderEnum == OrderByType.Desc, order, OrderByType.Desc); return source.ToPage(parm); } public PageListModel GetPages(Expression> where, PageQueryModel parm, Expression> order, string orderByType) { return GetPages(where, parm, order, orderByType == "desc" ? OrderByType.Desc : OrderByType.Asc); } /// /// 查询所有数据(无分页,请慎用) /// /// public List GetAll(bool useCache = false, int cacheSecond = 3600) { return Context.Queryable().WithCacheIF(useCache, cacheSecond).ToList(); } #endregion query /// /// 此方法不带output返回值 /// var list = new List(); /// list.Add(new SugarParameter(ParaName, ParaValue)); input /// /// /// /// public DataTable UseStoredProcedureToDataTable(string procedureName, List parameters) { return Context.Ado.UseStoredProcedure().GetDataTable(procedureName, parameters); } /// /// 带output返回值 /// var list = new List(); /// list.Add(new SugarParameter(ParaName, ParaValue, true)); output /// list.Add(new SugarParameter(ParaName, ParaValue)); input /// /// /// /// public (DataTable, List) UseStoredProcedureToTuple(string procedureName, List parameters) { var result = (Context.Ado.UseStoredProcedure().GetDataTable(procedureName, parameters), parameters); return result; } } /// /// 分页查询扩展 /// public static class QueryableExtension { /// /// 读取列表 /// /// /// 查询表单式 /// 分页参数 /// public static PageListModel ToPage(this ISugarQueryable source, PageQueryModel parm) { var page = new PageListModel(); var total = 0; page.PageSize = parm.PageSize; page.PageIndex = parm.PageIndex; if (string.IsNullOrEmpty(parm.Sort)) { source.OrderByPropertyName(parm.Sort, parm.SortType.Contains("desc") ? OrderByType.Desc : OrderByType.Asc); } page.Result = source //.OrderByIF(parm.Sort.IsNotEmpty(), $"{parm.Sort.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.SortType) && parm.SortType.Contains("desc") ? "desc" : "asc")}") .ToPageList(parm.PageIndex, parm.PageSize, ref total); page.TotalNum = total; return page; } /// /// 转指定实体类Dto /// /// /// /// /// /// public static PageListModel ToPage(this ISugarQueryable source, PageQueryModel parm) { var page = new PageListModel(); var total = 0; page.PageSize = parm.PageSize; page.PageIndex = parm.PageIndex; if (string.IsNullOrEmpty(parm.Sort)) { source.OrderByPropertyName(parm.Sort, parm.SortType.Contains("desc") ? OrderByType.Desc : OrderByType.Asc); } var result = source //.OrderByIF(parm.Sort.IsNotEmpty(), $"{parm.Sort.ToSqlFilter()} {(!string.IsNullOrWhiteSpace(parm.SortType) && parm.SortType.Contains("desc") ? "desc" : "asc")}") .ToPageList(parm.PageIndex, parm.PageSize, ref total); page.TotalNum = total; page.Result = result.Adapt>(); return page; } } }