using System.Data; using System.Linq.Expressions; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; using Tiobon.Core.Common; using Tiobon.Core.Common.DB; using Tiobon.Core.IRepository.Base; using Tiobon.Core.Model; using Tiobon.Core.Model.Entity; using Tiobon.Core.Model.Models; using Tiobon.Core.Model.Tenants; using Tiobon.Core.Repository.UnitOfWorks; namespace Tiobon.Core.Repository.Base; public class BaseRepository : IBaseRepository where TEntity : class, new() { private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly SqlSugarScope _dbBase; private ISqlSugarClient _db { get { ISqlSugarClient db = _dbBase; //修改使用 model备注字段作为切换数据库条件,使用sqlsugar TenantAttribute存放数据库ConnId //参考 https://www.donet5.com/Home/Doc?typeId=2246 var tenantAttr = typeof(TEntity).GetCustomAttribute(); if (tenantAttr != null) { //统一处理 configId 小写 db = _dbBase.GetConnectionScope(tenantAttr.configId.ToString().ToLower()); return db; } //多租户 var mta = typeof(TEntity).GetCustomAttribute(); if (mta is { TenantType: TenantTypeEnum.Db }) { //获取租户信息 租户信息可以提前缓存下来 if (App.User is { TenantId: > 0 }) { var tenant = db.Queryable().WithCache().Where(s => s.Id == App.User.TenantId).First(); if (tenant != null) { var iTenant = db.AsTenant(); if (!iTenant.IsAnyConnection(tenant.ConfigId)) { iTenant.AddConnection(tenant.GetConnectionConfig()); } return iTenant.GetConnectionScope(tenant.ConfigId); } } } return db; } } public ISqlSugarClient Db => _db; public BaseRepository(IUnitOfWorkManage unitOfWorkManage) { _unitOfWorkManage = unitOfWorkManage; _dbBase = unitOfWorkManage.GetDbClient(); } public async Task QueryById(object objId) { //return await Task.Run(() => _db.Queryable().InSingle(objId)); return await _db.Queryable().In(objId).SingleAsync(); } /// /// 查询实体数据是否存在 /// /// /// public async Task AnyAsync(object objId) { return await _db.Queryable().In(objId).AnyAsync(); } /// /// 查询实体数据是否存在 /// /// /// public bool Any(object objId) { return _db.Queryable().In(objId).Any(); } public async Task AnyAsync(Expression> whereExpression) { return await _db.Queryable().WhereIF(whereExpression != null, whereExpression).AnyAsync(); } /// /// 根据ID查询一条数据 /// /// id(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 /// 是否使用缓存 /// 数据实体 public async Task QueryById(object objId, bool blnUseCache = false) { //return await Task.Run(() => _db.Queryable().WithCacheIF(blnUseCache).InSingle(objId)); return await _db.Queryable().WithCacheIF(blnUseCache, 10).In(objId).SingleAsync(); } /// /// 根据ID查询数据 /// /// id列表(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 /// 数据实体列表 public async Task> QueryByIDs(object[] lstIds) { //return await Task.Run(() => _db.Queryable().In(lstIds).ToList()); return await _db.Queryable().In(lstIds).ToListAsync(); } /// /// 写入实体数据 /// /// 博文实体类 /// public async Task Add(TEntity entity) { //var i = await Task.Run(() => _db.Insertable(entity).ExecuteReturnBigIdentity()); ////返回的i是long类型,这里你可以根据你的业务需要进行处理 //return (int)i; var insert = _db.Insertable(entity); //这里你可以返回TEntity,这样的话就可以获取id值,无论主键是什么类型 //var return3 = await insert.ExecuteReturnEntityAsync(); return await insert.ExecuteReturnSnowflakeIdAsync(); } /// /// 写入实体数据 /// /// 实体类 /// 指定只插入列 /// 返回自增量列 public async Task Add(TEntity entity, Expression> insertColumns = null) { var insert = _db.Insertable(entity); if (insertColumns == null) { return await insert.ExecuteReturnSnowflakeIdAsync(); } else { return await insert.InsertColumns(insertColumns).ExecuteReturnSnowflakeIdAsync(); } } /// /// 批量插入实体(速度快) /// /// 实体集合 /// 影响行数 public async Task> Add(List listEntity) { return await _db.Insertable(listEntity.ToArray()).ExecuteReturnSnowflakeIdListAsync(); } /// /// 更新实体数据 /// /// 博文实体类 /// public async Task Update(TEntity entity) { ////这种方式会以主键为条件 //var i = await Task.Run(() => _db.Updateable(entity).ExecuteCommand()); //return i > 0; //这种方式会以主键为条件 return await _db.Updateable(entity).ExecuteCommandHasChangeAsync(); } /// /// 更新实体数据 /// /// 博文实体类 /// public async Task Update(List entity) { return await _db.Updateable(entity).ExecuteCommandHasChangeAsync(); } public async Task Update(TEntity entity, string where) { return await _db.Updateable(entity).Where(where).ExecuteCommandHasChangeAsync(); } public async Task Update(string sql, SugarParameter[] parameters = null) { return await _db.Ado.ExecuteCommandAsync(sql, parameters) > 0; } public async Task Update(object operateAnonymousObjects) { return await _db.Updateable(operateAnonymousObjects).ExecuteCommandAsync() > 0; } public async Task Update(TEntity entity, List lstColumns = null, List lstIgnoreColumns = null, string where = "") { IUpdateable up = _db.Updateable(entity); if (lstIgnoreColumns != null && lstIgnoreColumns.Count > 0) { up = up.IgnoreColumns(lstIgnoreColumns.ToArray()); } if (lstColumns != null && lstColumns.Count > 0) { up = up.UpdateColumns(lstColumns.ToArray()); } if (!string.IsNullOrEmpty(where)) { up = up.Where(where); } return await up.ExecuteCommandHasChangeAsync(); } public async Task Update(List entitys, List lstColumns = null, List lstIgnoreColumns = null, string where = "") { IUpdateable up = _db.Updateable(entitys); if (lstIgnoreColumns != null && lstIgnoreColumns.Count > 0) { up = up.IgnoreColumns(lstIgnoreColumns.ToArray()); } if (lstColumns != null && lstColumns.Count > 0) { up = up.UpdateColumns(lstColumns.ToArray()); } if (!string.IsNullOrEmpty(where)) { up = up.Where(where); } return await up.ExecuteCommandHasChangeAsync(); } /// /// 根据实体删除一条数据 /// /// 博文实体类 /// public async Task Delete(TEntity entity) { return await _db.Deleteable(entity).ExecuteCommandHasChangeAsync(); } /// /// 删除指定ID的数据 /// /// 主键ID /// public async Task DeleteById(object id) { return await _db.Deleteable().In(id).ExecuteCommandHasChangeAsync(); } /// /// 删除指定ID集合的数据(批量删除) /// /// 主键ID集合 /// public async Task DeleteByIds(object[] ids) { return await _db.Deleteable().In(ids).ExecuteCommandHasChangeAsync(); } /// /// 根据表达式,删除实体 /// /// 主键ID /// public async Task Delete(Expression> whereExpression) { return await _db.Deleteable().Where(whereExpression).ExecuteCommandHasChangeAsync(); } /// /// 查询所有数据 /// /// 数据列表 public async Task> Query() { return await _db.Queryable().ToListAsync(); } /// /// 查询数据列表 /// /// 条件 /// 数据列表 public async Task> Query(string where) { return await _db.Queryable().WhereIF(!string.IsNullOrEmpty(where), where).ToListAsync(); } /// /// 查询数据列表 /// /// whereExpression /// 数据列表 public async Task> Query(Expression> whereExpression) { return await _db.Queryable().WhereIF(whereExpression != null, whereExpression).ToListAsync(); } /// /// 按照特定列查询数据列表 /// /// /// /// public async Task> Query(Expression> expression) { return await _db.Queryable().Select(expression).ToListAsync(); } /// /// 按照特定列查询数据列表带条件排序 /// /// /// 过滤条件 /// 查询实体条件 /// 排序条件 /// public async Task> Query(Expression> expression, Expression> whereExpression, string orderByFields) { return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields).WhereIF(whereExpression != null, whereExpression).Select(expression).ToListAsync(); } /// /// 查询一个列表 /// /// 条件表达式 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query(Expression> whereExpression, string orderByFields) { return await _db.Queryable().WhereIF(whereExpression != null, whereExpression).OrderByIF(orderByFields != null, orderByFields).ToListAsync(); } /// /// 查询一个列表 /// /// /// /// /// public async Task> Query(Expression> whereExpression, Expression> orderByExpression, bool isAsc = true) { //return await Task.Run(() => _db.Queryable().OrderByIF(orderByExpression != null, orderByExpression, isAsc ? OrderByType.Asc : OrderByType.Desc).WhereIF(whereExpression != null, whereExpression).ToList()); return await _db.Queryable().OrderByIF(orderByExpression != null, orderByExpression, isAsc ? OrderByType.Asc : OrderByType.Desc).WhereIF(whereExpression != null, whereExpression).ToListAsync(); } /// /// 查询一个列表 /// /// 条件 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query(string where, string orderByFields) { return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields).WhereIF(!string.IsNullOrEmpty(where), where).ToListAsync(); } /// /// 查询前N条数据 /// /// 条件表达式 /// 前N条 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( Expression> whereExpression, int top, string orderByFields) { return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields).WhereIF(whereExpression != null, whereExpression).Take(top).ToListAsync(); } /// /// 查询前N条数据 /// /// 条件 /// 前N条 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( string where, int top, string orderByFields) { return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields).WhereIF(!string.IsNullOrEmpty(where), where).Take(top).ToListAsync(); } /// /// 根据sql语句查询 /// /// 完整的sql语句 /// 参数 /// 泛型集合 public async Task> QuerySql(string sql, SugarParameter[] parameters = null) { return await _db.Ado.SqlQueryAsync(sql, parameters); } /// /// 根据sql语句查询 /// /// 完整的sql语句 /// 参数 /// DataTable public async Task QueryTable(string sql, SugarParameter[] parameters = null) { return await _db.Ado.GetDataTableAsync(sql, parameters); } /// /// /// 条件表达式 /// 页码(下标0) /// 页大小 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( Expression> whereExpression, int pageIndex, int pageSize, string orderByFields) { return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields) .WhereIF(whereExpression != null, whereExpression).ToPageListAsync(pageIndex, pageSize); } /// /// 分页查询 /// /// 条件 /// 页码(下标0) /// 页大小 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( string where, int pageIndex, int pageSize, string orderByFields) { return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields) .WhereIF(!string.IsNullOrEmpty(where), where).ToPageListAsync(pageIndex, pageSize); } /// /// 分页查询[使用版本,其他分页未测试] /// /// 条件表达式 /// 页码(下标0) /// 页大小 /// 排序字段,如name asc,age desc /// public async Task> QueryPage(Expression> whereExpression, int pageIndex = 1, int pageSize = 20, string orderByFields = null) { RefAsync totalCount = 0; var list = await _db.Queryable() .OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields) .WhereIF(whereExpression != null, whereExpression) .ToPageListAsync(pageIndex, pageSize, totalCount); return new PageModel(pageIndex, totalCount, pageSize, list); } /// /// 分页查询[使用版本,其他分页未测试] /// /// 条件表达式 /// 页码(下标0) /// 页大小 /// 排序字段,如name asc,age desc /// public async Task> QueryFilterPage(QueryBody filter) { RefAsync totalCount = 0; var query = _db.Queryable(); string conditions = "1=1"; if (filter.jsonParam != null) foreach (JProperty jProperty in filter.jsonParam.Properties()) { var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "page" || name == "pageSize") continue; if (!string.IsNullOrWhiteSpace(value)) { var jsonParam = JsonConvert.DeserializeObject(value); switch (jsonParam.operationKey) { case "Include": conditions += $" AND {name} LIKE '%{jsonParam.columnValue}%'"; break; case "NotInclude": conditions += $" AND {name} NOT LIKE '%{jsonParam.columnValue}%'"; break; case "IsNull": conditions += $" AND {name} IS NULL"; break; case "NotNull": conditions += $" AND {name} IS NOT NULL"; break; case "Equal": conditions += $" AND {name} ='{jsonParam.columnValue}'"; break; case "NotEqual": conditions += $" AND {name} !='{jsonParam.columnValue}'"; break; default: break; } } } if (filter.pageSize == 0) filter.pageSize = 10000; query = query.Where(conditions); var list = await query .OrderByIF(!string.IsNullOrEmpty(filter.orderBy), filter.orderBy) .ToPageListAsync(filter.pageNum, filter.pageSize, totalCount); return new ServicePageResult(filter.pageNum, totalCount, filter.pageSize, list); } /// ///查询-多表查询 /// /// 实体1 /// 实体2 /// 实体3 /// 返回对象 /// 关联表达式 (join1,join2) => new object[] {JoinType.Left,join1.UserNo==join2.UserNo} /// 返回表达式 (s1, s2) => new { Id =s1.UserNo, Id1 = s2.UserNo} /// 查询表达式 (w1, w2) =>w1.UserNo == "") /// public async Task> QueryMuch( Expression> joinExpression, Expression> selectExpression, Expression> whereLambda = null) where T : class, new() { if (whereLambda == null) { return await _db.Queryable(joinExpression).Select(selectExpression).ToListAsync(); } return await _db.Queryable(joinExpression).Where(whereLambda).Select(selectExpression).ToListAsync(); } /// /// 两表联合查询-分页 /// /// 实体1 /// 实体1 /// 返回对象 /// 关联表达式 /// 返回表达式 /// 查询表达式 /// 页码 /// 页大小 /// 排序字段 /// public async Task> QueryTabsPage( Expression> joinExpression, Expression> selectExpression, Expression> whereExpression, int pageIndex = 1, int pageSize = 20, string orderByFields = null) { RefAsync totalCount = 0; var list = await _db.Queryable(joinExpression) .Select(selectExpression) .OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields) .WhereIF(whereExpression != null, whereExpression) .ToPageListAsync(pageIndex, pageSize, totalCount); return new PageModel(pageIndex, totalCount, pageSize, list); } /// /// 两表联合查询-分页-分组 /// /// 实体1 /// 实体1 /// 返回对象 /// 关联表达式 /// 返回表达式 /// 查询表达式 /// group表达式 /// 页码 /// 页大小 /// 排序字段 /// public async Task> QueryTabsPage( Expression> joinExpression, Expression> selectExpression, Expression> whereExpression, Expression> groupExpression, int pageIndex = 1, int pageSize = 20, string orderByFields = null) { RefAsync totalCount = 0; var list = await _db.Queryable(joinExpression).GroupBy(groupExpression) .Select(selectExpression) .OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields) .WhereIF(whereExpression != null, whereExpression) .ToPageListAsync(pageIndex, pageSize, totalCount); return new PageModel(pageIndex, totalCount, pageSize, list); } //var exp = Expressionable.Create() // .And(s => s.tdIsDelete != true) // .And(p => p.IsDeleted != true) // .And(p => p.pmId != null) // .AndIF(!string.IsNullOrEmpty(model.paramCode1), (s) => s.uID == model.paramCode1.ObjToInt()) // .AndIF(!string.IsNullOrEmpty(model.searchText), (s) => (s.groupName != null && s.groupName.Contains(model.searchText)) // || (s.jobName != null && s.jobName.Contains(model.searchText)) // || (s.uRealName != null && s.uRealName.Contains(model.searchText))) // .ToExpression();//拼接表达式 //var data = await _projectMemberServices.QueryTabsPage( // (s, p) => new object[] { JoinType.Left, s.uID == p.uId }, // (s, p) => new ProjectToUser // { // uID = s.uID, // uRealName = s.uRealName, // groupName = s.groupName, // jobName = s.jobName // }, exp, s => new { s.uID, s.uRealName, s.groupName, s.jobName }, model.currentPage, model.pageSize, model.orderField + " " + model.orderType); #region Split分表基础接口 (基础CRUD) /// /// 分页查询[使用版本,其他分页未测试] /// /// 条件表达式 /// 页码(下标0) /// 页大小 /// 排序字段,如name asc,age desc /// public async Task> QueryPageSplit(Expression> whereExpression, DateTime beginTime, DateTime endTime, int pageIndex = 1, int pageSize = 20, string orderByFields = null) { RefAsync totalCount = 0; var list = await _db.Queryable().SplitTable(beginTime, endTime) .OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields) .WhereIF(whereExpression != null, whereExpression) .ToPageListAsync(pageIndex, pageSize, totalCount); var data = new PageModel(pageIndex, totalCount, pageSize, list); return data; } /// /// 写入实体数据 /// /// 数据实体 /// public async Task> AddSplit(TEntity entity) { var insert = _db.Insertable(entity).SplitTable(); //插入并返回雪花ID并且自动赋值ID  return await insert.ExecuteReturnSnowflakeIdListAsync(); } /// /// 更新实体数据 /// /// 数据实体 /// public async Task UpdateSplit(TEntity entity, DateTime dateTime) { //直接根据实体集合更新 (全自动 找表更新) //return await _db.Updateable(entity).SplitTable().ExecuteCommandAsync();//,SplitTable不能少 //精准找单个表 var tableName = _db.SplitHelper().GetTableName(dateTime); //根据时间获取表名 return await _db.Updateable(entity).AS(tableName).ExecuteCommandHasChangeAsync(); } /// /// 删除数据 /// /// /// /// public async Task DeleteSplit(TEntity entity, DateTime dateTime) { ////直接根据实体集合删除 (全自动 找表插入),返回受影响数 //return await _db.Deleteable(entity).SplitTable().ExecuteCommandAsync();//,SplitTable不能少 //精准找单个表 var tableName = _db.SplitHelper().GetTableName(dateTime); //根据时间获取表名 return await _db.Deleteable().AS(tableName).Where(entity).ExecuteCommandHasChangeAsync(); } /// /// 根据ID查找数据 /// /// /// public async Task QueryByIdSplit(object objId) { return await _db.Queryable().In(objId).SplitTable(tabs => tabs).SingleAsync(); } /// /// 数据过滤用的查询表达式构建 /// /// /// protected Expression> CreateFilterExpression() where TEntity : class { Expression> expression = null; //if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity))) //{ // Expression> softDeleteFilter = e => !((ISoftDelete)e).IsDeleted; // expression = expression == null ? softDeleteFilter : CombineExpressions(expression, softDeleteFilter); //} if (typeof(IMayHaveTenant).IsAssignableFrom(typeof(TEntity)))// && IsMayHaveTenantFilterEnabled) { Expression> mayHaveTenantFilter = e => ((IMayHaveTenant)e).IsEnable == 1; expression = expression == null ? mayHaveTenantFilter : CombineExpressions(expression, mayHaveTenantFilter); } return expression; } protected Expression> CombineExpressions( Expression> expression1, Expression> expression2) { return Common.Helper.ExpressionCombiner.Combine(expression1, expression2); } #endregion } public interface IMayHaveTenant { int IsEnable { get; set; } }