using SqlSugar; using System.Data; using System.Linq.Expressions; using Yi.Framework.Common.Attribute; using Yi.Framework.Common.Models; using Yi.Framework.Model.Models; using Yi.Framework.Model.Query; /***这里面写的代码不会给覆盖,如果要重新生成请删除 Repository.cs ***/ namespace Yi.Framework.Repository { /// /// 仓储模式 /// /// [AppService] public class Repository : SimpleClient, IRepository where T : class, new() { public ISugarQueryable _DbQueryable { get { return base.Context.Queryable(); } set { } } public ISqlSugarClient _Db { get { return base.Context; } set { } } /// /// 构造函数 /// /// public Repository(ISqlSugarClient context) : base(context)//注意这里要有默认值等于null { ////开始Saas分库! ////单个公共基础库+多个租户业务库 ////1:先判断操作对应实体上是否存在租户特性,如果存在说明是公共库 //var anyTenant = typeof(T).GetCustomAttributes(false).Any(a => a.GetType().Equals(typeof(TenantAttribute))); ////如果是公共库,直接使用默认库即可 //if (anyTenant) //{ // base.Context = _Db.AsTenant().GetConnectionScope("0"); //} ////如果不是公共库 //else //{ // //2:根据上下文对象获取用户的租户id、数据库连接串及用户信息 // string tenantId = "获取用户的租户id"; // string connection = "获取用户信息中的数据库连接字符串"; // //如果该租户未添加到db对象中 // if (!_Db.AsTenant().IsAnyConnection(tenantId)) // { // //添加业务库只在当前上下文有效 // _Db.AsTenant().AddConnection(new ConnectionConfig() // { // ConfigId = tenantId, // ConnectionString = connection, // //数据库类型同样可以动态配置 // DbType = SqlSugar.DbType.MySql, // IsAutoCloseConnection = true // }); // } // //3:根据租户id获取到对应db对象,替换仓储中的db对象即可 // base.Context = _Db.AsTenant().GetConnectionScope(tenantId); //} } /// /// 异步事务 /// /// /// public async Task UseTranAsync(Func func) { var con = Context; var res = await _Db.AsTenant().UseTranAsync(func); return res.IsSuccess; } /// /// 执行查询sql返回dto列表 /// /// /// /// public async Task> UseSqlAsync(string sql, object parameters = null) { return await _Db.Ado.SqlQueryAsync(sql, parameters); } /// /// 执行增删改sql返回状态 /// /// /// public async Task UseSqlAsync(string sql, object parameters) { return await _Db.Ado.ExecuteCommandAsync(sql, parameters) > 0; } /// /// 更新忽略空值 /// /// /// public async Task UpdateIgnoreNullAsync(T entity) { return await _Db.Updateable(entity).IgnoreColumns(true).ExecuteCommandAsync() > 0; } /// /// 调用存储过程 /// /// /// /// /// public async Task> StoreAsync(string storeName, object para) { return await _Db.Ado.UseStoredProcedure().SqlQueryAsync(storeName, para); } /// /// 多条件查询 /// /// /// public async Task> GetListAsync(QueryCondition pars) { return await QueryConditionHandler(pars).ToListAsync(); } /// /// 仓储扩展方法:单表查询通用分页 /// /// public async Task>> CommonPageAsync(QueryPageCondition pars) { RefAsync tolCount = 0; var result = await QueryConditionHandler(new QueryCondition() { OrderBys = pars.OrderBys, Parameters = pars.Parameters }).ToPageListAsync(pars.Index, pars.Size, tolCount); return new PageModel> { Total = tolCount.Value, Data = result }; } public ISugarQueryable QueryConditionHandler(QueryCondition pars) { var sugarParamters = pars.Parameters.Select(it => (IConditionalModel)new ConditionalModel() { ConditionalType = it.Type, FieldName = it.Key, FieldValue = it.Value }).ToList(); var query = _Db.Queryable(); if (pars.OrderBys != null) { foreach (var item in pars.OrderBys) { if (pars.IsAsc) { query.OrderBy(item.ToSqlFilter() + " asc"); } else { query.OrderBy(item.ToSqlFilter() + " desc"); } } } return query.Where(sugarParamters); } /// /// 更新高级保存,验证重复 /// /// /// /// public async Task UpdateSuperSaveAsync(T data, Expression> columns) { var x = _Db.Storageable(data) .SplitError(it => it.Any()) .SplitUpdate(it => true) .WhereColumns(columns)//这里用name作为数据库查找条件 .ToStorage(); return await x.AsInsertable.ExecuteCommandAsync() > 0;//插入可插入部分 } /// /// 添加高级保存,验证重复 /// /// /// /// public async Task InsertSuperSaveAsync(T data, Expression> columns) { var x = _Db.Storageable(data) .SplitError(it => it.Any()) .SplitInsert(it => true) .WhereColumns(columns)//这里用name作为数据库查找条件 .ToStorage(); return await x.AsInsertable.ExecuteCommandAsync() > 0;//插入可插入部分 } /// /// 方法重载,多条件获取第一个值 /// /// public async Task GetFirstAsync(Expression> where, Expression> order, OrderByType orderByType = OrderByType.Desc) { return await _Db.Queryable().Where(where).OrderBy(order, orderByType).FirstAsync(); } /// /// 方法重载,多条件获取范围 /// /// public async Task> GetListAsync(Expression> where, Expression> order, OrderByType orderByType = OrderByType.Desc) { return await _Db.Queryable().Where(where).OrderBy(order, orderByType).ToListAsync(); } } }