using AUCMA.STORE.Common; using AUCMA.STORE.Entity; using AUCMA.STORE.Entity.DAO; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace AUCMA.STORE.SqlSugar.serviceImpl { public class BaseServices : IBaseServices where TEntity : class, new() { private SqlSugarClient _dbBase; private SqlSugarClient _db { get { try { _dbBase = new SqlSugarClient(new ConnectionConfig() { ConnectionString = ConfigHelper.GetConfig("OracleDataSource"), DbType = DbType.Oracle, InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息 IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了 //InitKey默认SystemTable }); //可注释 _dbBase.Aop.OnLogExecuting = (sql, pars) => //SQL执行中事件 { Parallel.For(0, 1, e => { string SqlLog = ""; foreach (string item in new string[] { GetParas(pars), "【SQL语句】:" + sql }) { SqlLog = SqlLog + item; } }); }; } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } return _dbBase; } } private string GetParas(SugarParameter[] pars) { string key = "【SQL参数】:"; foreach (var param in pars) { key += $"{param.ParameterName}:{param.Value}\n"; } return key; } internal SqlSugarClient Db { get { return _db; } } public async Task QuerySingle(Expression> whereExpression) { return await _db.Queryable().WhereIF(whereExpression != null, whereExpression).SingleAsync(); } public async Task QueryById(object objId) { return await _db.Queryable().In(objId).SingleAsync(); } /// /// 功能描述:根据ID查询一条数据 /// /// /// id(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 /// 是否使用缓存 /// 数据实体 public async Task QueryById(object objId, bool blnUseCache = false) { return await _db.Queryable().WithCacheIF(blnUseCache).In(objId).SingleAsync(); } /// /// 功能描述:根据ID查询数据 /// /// /// id列表(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件 /// 数据实体列表 public async Task> QueryByIDs(object[] lstIds) { return await _db.Queryable().In(lstIds).ToListAsync(); } /// /// 写入实体数据 /// /// 博文实体类 /// 影响行数 public async Task Add(TEntity entity) { try { //return await _db.Insertable(entity).ExecuteReturnIdentityAsync(); return await _db.Insertable(entity).ExecuteCommandAsync(); } catch (Exception ex) { return 0; } } public async Task AddLog(TEntity entity) { try { var insert = _db.Insertable(entity); return await insert.ExecuteReturnIdentityAsync(); } catch (Exception ex) { //LogHelper.Error("插入出錯:" + ex.Message); return 0; } } /// /// 批量插入实体(速度快) /// /// 实体集合 /// 影响行数 public async Task Add(List listEntity) { return await _db.Insertable(listEntity.ToArray()).ExecuteCommandAsync(); } /// /// 更新实体数据 /// /// 博文实体类 /// public async Task Update(TEntity entity) { try { ////这种方式会以主键为条件 //var i = await Task.Run(() => _db.Updateable(entity).ExecuteCommand()); //return i > 0; //这种方式会以主键为条件 return await _db.Updateable(entity).ExecuteCommandHasChangeAsync(); } catch (Exception ex) { return false; } } public async Task Update(TEntity entity, string strWhere) { //return await Task.Run(() => _db.Updateable(entity).Where(strWhere).ExecuteCommand() > 0); return await _db.Updateable(entity).Where(strWhere).ExecuteCommandHasChangeAsync(); } public async Task Update(string strSql, SugarParameter[] parameters = null) { //return await Task.Run(() => _db.Ado.ExecuteCommand(strSql, parameters) > 0); return await _db.Ado.ExecuteCommandAsync(strSql, 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 strWhere = "" ) { 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(strWhere)) { up = up.Where(strWhere); } return await up.ExecuteCommandHasChangeAsync(); } /// /// 根据实体删除一条数据 /// /// 实体类 /// public async Task Delete(TEntity entity) { //var i = await Task.Run(() => _db.Deleteable(entity).ExecuteCommand()); //return i > 0; return await _db.Deleteable(entity).ExecuteCommandHasChangeAsync(); } /// /// 根据表达式删除 /// /// /// public async Task Delete(Expression> whereExpression) { return await _db.Deleteable().Where(whereExpression).ExecuteCommandHasChangeAsync(); } /// /// 删除指定ID的数据 /// /// 主键ID /// public async Task DeleteById(object id) { //var i = await Task.Run(() => _db.Deleteable(id).ExecuteCommand()); //return i > 0; return await _db.Deleteable(id).ExecuteCommandHasChangeAsync(); } /// /// 删除指定ID集合的数据(批量删除) /// /// 主键ID集合 /// public async Task DeleteByIds(object[] ids) { //var i = await Task.Run(() => _db.Deleteable().In(ids).ExecuteCommand()); //return i > 0; return await _db.Deleteable().In(ids).ExecuteCommandHasChangeAsync(); } /// /// 功能描述:查询所有数据 /// /// /// 数据列表 public async Task> Query() { return await _db.Queryable().ToListAsync(); } /// /// 功能描述:查询数据列表 /// /// /// 条件 /// 数据列表 public async Task> Query(string strWhere) { //return await Task.Run(() => _db.Queryable().WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToList()); return await _db.Queryable().WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToListAsync(); } public List Query1(Expression> whereExpression) { try { return _db.Queryable().WhereIF(whereExpression != null, whereExpression).ToList(); } catch (Exception ex) { //LogRecordService.LogAdd(new Model.Models.Base_LogRecord(Model.Enums.LogType.查询记录, null, "查询失败:" + ex.Message, DateTime.Now)); return null; } } /// /// 功能描述:查询数据列表 /// /// /// whereExpression /// 数据列表 public async Task> Query(Expression> whereExpression) { try { return await _db.Queryable().WhereIF(whereExpression != null, whereExpression).ToListAsync(); } catch (Exception ex) { //LogRecordService.LogAdd(new Model.Models.Base_LogRecord(Model.Enums.LogType.查询记录, null, "查询失败:" + ex.Message, DateTime.Now)); return null; } } /// /// 功能描述:查询一个列表 /// /// /// 条件表达式 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query(Expression> whereExpression, string strOrderByFileds) { //return await Task.Run(() => _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).ToList()); return await _db.Queryable().WhereIF(whereExpression != null, whereExpression).OrderByIF(strOrderByFileds != null, strOrderByFileds).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()); try { return await _db.Queryable().OrderByIF(orderByExpression != null, orderByExpression, isAsc ? OrderByType.Asc : OrderByType.Desc).WhereIF(whereExpression != null, whereExpression).ToListAsync(); } catch (Exception ex) { //LogHelper.Error(ex.Message); return null; } } /// /// 排序取第一条 /// /// /// /// /// public async Task QueryFirst(Expression> whereExpression, Expression> orderByExpression, bool isAsc = true) { try { TEntity info = await _db.Queryable().OrderByIF(orderByExpression != null, orderByExpression, isAsc ? OrderByType.Asc : OrderByType.Desc).WhereIF(whereExpression != null, whereExpression).FirstAsync(); //if (info != null) //LogRecordService.LogAdd(new Model.Models.Base_LogRecord(Model.Enums.LogType.查询记录, "查询成功:" + JsonChange.ModeToJson(info), null, DateTime.Now)); return info; } catch (Exception ex) { //LogRecordService.LogAdd(new Model.Models.Base_LogRecord(Model.Enums.LogType.查询记录, null, "查询失败:" + ex.Message, DateTime.Now)); return null; } } /// /// 功能描述:查询一个列表 /// /// /// 条件 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query(string strWhere, string strOrderByFileds) { //return await Task.Run(() => _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToList()); return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToListAsync(); } /// /// 功能描述:查询前N条数据 /// /// /// 条件表达式 /// 前N条 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( Expression> whereExpression, int intTop, string strOrderByFileds) { //return await Task.Run(() => _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).Take(intTop).ToList()); return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).Take(intTop).ToListAsync(); } /// /// 功能描述:查询前N条数据 /// /// /// 条件 /// 前N条 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( string strWhere, int intTop, string strOrderByFileds) { //return await Task.Run(() => _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).Take(intTop).ToList()); return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).Take(intTop).ToListAsync(); } /// /// 功能描述:分页查询 /// /// /// 条件表达式 /// 页码(下标0) /// 页大小 /// 数据总量 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( Expression> whereExpression, int intPageIndex, int intPageSize, string strOrderByFileds) { //return await Task.Run(() => _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).ToPageList(intPageIndex, intPageSize)); return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).ToPageListAsync(intPageIndex, intPageSize); } /// /// 功能描述:分页查询 /// /// /// 条件 /// 页码(下标0) /// 页大小 /// 数据总量 /// 排序字段,如name asc,age desc /// 数据列表 public async Task> Query( string strWhere, int intPageIndex, int intPageSize, string strOrderByFileds) { //return await Task.Run(() => _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToPageList(intPageIndex, intPageSize)); return await _db.Queryable().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToPageListAsync(intPageIndex, intPageSize); } /// /// 分页查询[使用版本,其他分页未测试] /// /// 条件表达式 /// 页码(下标0) /// 页大小 /// 排序字段,如name asc,age desc /// public async Task> QueryPage(Expression> whereExpression, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null) { RefAsync totalCount = 0; var list = await _db.Queryable() .OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds) .WhereIF(whereExpression != null, whereExpression) .ToPageListAsync(intPageIndex, intPageSize, totalCount); int pageCount = (Math.Ceiling(totalCount.ObjToDecimal2() / intPageSize.ObjToDecimal2())).ObjToInt2(); return new PageModel() { dataCount = totalCount, pageCount = pageCount, page = intPageIndex, PageSize = intPageSize, data = list }; } /// ///查询-多表查询 /// /// 实体1 /// 实体2 /// 实体3 /// 实体4 /// 实体5 /// 返回对象 /// 关联表达式 (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).Select(selectExpression).MergeTable().Where(whereLambda).ToListAsync(); } /// ///查询-多表查询 /// /// 实体1 /// 实体2 /// 实体3 /// 实体4 /// 返回对象 /// 关联表达式 (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).Select(selectExpression).MergeTable().Where(whereLambda).ToListAsync(); } /// ///查询-多表查询 /// /// 实体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).Select(selectExpression).MergeTable().Where(whereLambda).ToListAsync(); } /// ///查询-多表查询 /// /// 实体1 /// 实体2 /// 返回对象 /// 关联表达式 (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).Select(selectExpression).MergeTable().Where(whereLambda).ToListAsync(); } #region 多表分页 /// ///查询-多表查询 /// /// 实体1 /// 实体2 /// 实体3 /// 实体4 /// 实体5 /// 返回对象 /// 关联表达式 (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> QueryMuchPage( Expression> joinExpression, Expression> selectExpression, Expression> whereLambda = null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null) where T : class, new() { RefAsync totalCount = 0; var list = await _db.Queryable(joinExpression) .Select(selectExpression) .MergeTable() .WhereIF(whereLambda != null, whereLambda) .OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds) .ToPageListAsync(intPageIndex, intPageSize, totalCount); int pageCount = (Math.Ceiling(totalCount.ObjToDecimal2() / intPageSize.ObjToDecimal2())).ObjToInt2(); return new PageModel() { dataCount = totalCount, pageCount = pageCount, page = intPageIndex, PageSize = intPageSize, data = list }; } /// ///查询-多表查询 /// /// 实体1 /// 实体2 /// 实体3 /// 实体4 /// 返回对象 /// 关联表达式 (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> QueryMuchPage( Expression> joinExpression, Expression> selectExpression, Expression> whereLambda = null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null) where T : class, new() { RefAsync totalCount = 0; var list = await _db.Queryable(joinExpression) .Select(selectExpression) .MergeTable() .WhereIF(whereLambda != null, whereLambda) .OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds) .ToPageListAsync(intPageIndex, intPageSize, totalCount); int pageCount = (Math.Ceiling(totalCount.ObjToDecimal2() / intPageSize.ObjToDecimal2())).ObjToInt2(); return new PageModel() { dataCount = totalCount, pageCount = pageCount, page = intPageIndex, PageSize = intPageSize, data = 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> QueryMuchPage( Expression> joinExpression, Expression> selectExpression, Expression> whereLambda = null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null) where T : class, new() { RefAsync totalCount = 0; var list = await _db.Queryable(joinExpression) .Select(selectExpression) .MergeTable() .WhereIF(whereLambda != null, whereLambda) .OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds) .ToPageListAsync(intPageIndex, intPageSize, totalCount); int pageCount = (Math.Ceiling(totalCount.ObjToDecimal2() / intPageSize.ObjToDecimal2())).ObjToInt2(); return new PageModel() { dataCount = totalCount, pageCount = pageCount, page = intPageIndex, PageSize = intPageSize, data = list }; } /// ///查询-多表查询 /// /// 实体1 /// 实体2 /// 返回对象 /// 关联表达式 (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> QueryMuchPage( Expression> joinExpression, Expression> selectExpression, Expression> whereLambda = null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null) where T : class, new() { RefAsync totalCount = 0; var list = await _db.Queryable(joinExpression) .Select(selectExpression) .MergeTable() .WhereIF(whereLambda != null, whereLambda) .OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds) .ToPageListAsync(intPageIndex, intPageSize, totalCount); int pageCount = (Math.Ceiling(totalCount.ObjToDecimal2() / intPageSize.ObjToDecimal2())).ObjToInt2(); return new PageModel() { dataCount = totalCount, pageCount = pageCount, page = intPageIndex, PageSize = intPageSize, data = list }; } /// ///查询-多表查询(测试) /// /// 实体1 /// 实体2 /// 返回对象 /// 关联表达式 (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> QueryMuchPage( Expression> joinExpression, Expression> selectExpression, Expression> sortExpression, Expression> whereLambda = null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null) where T : class, new() { RefAsync totalCount = 0; var list = await _db.Queryable(joinExpression) .WhereIF(whereLambda != null, whereLambda) .Select(selectExpression) .OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds) .ToPageListAsync(intPageIndex, intPageSize, totalCount); int pageCount = (Math.Ceiling(totalCount.ObjToDecimal2() / intPageSize.ObjToDecimal2())).ObjToInt2(); return new PageModel() { dataCount = totalCount, pageCount = pageCount, page = intPageIndex, PageSize = intPageSize, data = list }; } #endregion /// /// 存储过程 /// /// /// /// public async Task> QueryByProc(string proc, List parameters) where T : class, new() { //var nameP = new SugarParameter("@name", "张三"); //var ageP = new SugarParameter("@age", null, true);//isOutput=true //var ddd = new List(); return await _db.Ado.UseStoredProcedure().SqlQueryAsync(proc, parameters); } public async Task, List>> QueryByProc(string proc, List parameters) where T : class, new() { return await _db.Ado.UseStoredProcedure().SqlQueryAsync(proc, parameters); } /// /// sql语句 /// public async Task> QueryBySql(string sql, List parameters) where T : class, new() { try { return await _db.Ado.SqlQueryAsync(sql, parameters); }catch(Exception ex) { Console.WriteLine("QueryBySql语句执行异常:" + ex.Message); return new List(); } } /// /// 自定义查询 /// /// public List QueryList(Expression> whereExpression) { return _db.Queryable().WhereIF(whereExpression != null, whereExpression).ToList(); } } }