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();
}
}
}