/// <summary> /// 删除对象 /// </summary> /// <param name="dto">对象</param> public int Delete <T>(T dto) where T : class, new() { ExHelper.ThrowIfNull(dto, "操作对象不能为空."); int rowCount = 0; using (DbCommand dbCommand = dbProvider.GetDeleteDbCmd <T>(dto, this.GetSubTableArg <T>())) { try { dbCommand.Connection = GetDbConnection(); rowCount = dbCommand.ExecuteNonQuery(); if (rowCount <= 0) { //throw new Exception("没有删除任何记录."); } CloseDbConnection(dbCommand); } catch (Exception ex) { CloseDbConnection(dbCommand); throw ex; } } return(rowCount); }
/// <summary> /// 条件删除 /// </summary> /// <param name="where">删除条件</param> public int Delete <T>(Expression <Func <T, bool> > where) where T : class, new() { ExHelper.ThrowIfNull(where, "删除条件对象不能为空."); int rowCount = 0; QueryFilter filter = QueryFilterHelper.GetFilter(where); using (DbCommand dbCommand = dbProvider.GetDeleteDbCmd <T>(filter, this.GetSubTableArg <T>())) { try { dbCommand.Connection = GetDbConnection(); rowCount = dbCommand.ExecuteNonQuery(); if (rowCount <= 0) { //throw new Exception("没有删除任何记录."); } CloseDbConnection(dbCommand); } catch (Exception ex) { CloseDbConnection(dbCommand); throw ex; } } return(rowCount); }
/// <summary> /// 更新数据对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dto">实体对象</param> /// <param name="select">更新属性</param> public int Update <T>(T dto, Expression <Func <T, object> > select = null) where T : class, new() { ExHelper.ThrowIfNull(dto, "操作对象不能为空."); int rowCount = 0; DtoMapping dtoDbMapping = DtoMappingHelper.GetDtoMapping <T>(); List <PiMap> piMapList = DtoMappingHelper.GetPiMapList <T>(select); using (DbCommand dbCommand = dbProvider.GetUpdateDbCmd(dto, piMapList, this.GetSubTableArg <T>())) { try { dbCommand.Connection = GetDbConnection(); rowCount = dbCommand.ExecuteNonQuery(); if (rowCount <= 0) { //throw new Exception("没有更新任何记录."); } CloseDbConnection(dbCommand); } catch (Exception ex) { CloseDbConnection(dbCommand); throw ex; } } return(rowCount); }
/// <summary> /// 保存or更新数据对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dto">实体对象</param> /// <param name="select">查询属性</param> public int Set <T>(T dto, Expression <Func <T, object> > select = null) where T : class, new() { ExHelper.ThrowIfNull(dto, "操作对象不能为空."); int rowCount = 0; DtoMapping dtoDbMapping = DtoMappingHelper.GetDtoMapping <T>(); object pkValue = dtoDbMapping.PkMap.Pi.GetValue(dto); if (ExHelper.IsNullOrEmpty(pkValue)) { rowCount = Add(dto, select); } else { rowCount = Update(dto, select); } return(rowCount); }
/// <summary> /// 批量保存数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list">实体对象</param> /// <param name="select">查询属性</param> /// <param name="useTransaction">使用事务操作 默认false</param> /// <param name="progress">保存进度</param> public int SetList <T>(List <T> list, Expression <Func <T, object> > select = null, bool useTransaction = false, IProgress <double> progress = null) where T : class, new() { if (list == null || list.Count <= 0) { return(0); } int rowCount = 0; DtoMapping dtoDbMapping = DtoMappingHelper.GetDtoMapping <T>(); List <T> addList = new List <T>(); List <T> updateList = new List <T>(); #region 拆分新增或更新对象List for (int i = 0; i < list.Count; i++) { object pkValue = dtoDbMapping.PkMap.Pi.GetValue(list[i]); if (ExHelper.IsNullOrEmpty(pkValue)) { addList.Add(list[i]); } else { updateList.Add(list[i]); } } #endregion if (useTransaction) { if (addList.Count > 0 && updateList.Count > 0) { throw new Exception("插入和更新操作同时存在时,不能启用事务."); } } if (addList.Count > 0) { rowCount += AddList(addList, select, useTransaction, progress); } if (updateList.Count > 0) { rowCount += UpdateList(updateList, select, useTransaction, progress); } return(rowCount); }
/// <summary> /// 保存数据对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dto">实体对象</param> /// <param name="select">查询属性</param> public int Add <T>(T dto, Expression <Func <T, object> > select = null) where T : class, new() { ExHelper.ThrowIfNull(dto, "操作对象不能为空."); int rowCount = 0; DtoMapping dtoDbMapping = DtoMappingHelper.GetDtoMapping <T>(); List <PiMap> piMapList = DtoMappingHelper.GetPiMapList <T>(select); if (dtoDbMapping.TableAttr.AutoCreate) { //如果是自动建表 if (!CheckTableExists <T>()) { CreateTable <T>(); } } object pkValue = dtoDbMapping.PkMap.Pi.GetValue(dto); if (!dtoDbMapping.IsAutoIncrementPk) { //Guid Id if (pkValue == null || (Guid)pkValue == Guid.Empty) { //生成Guid dtoDbMapping.PkMap.Pi.SetValue(dto, Guid.NewGuid()); } if (!piMapList.Contains(dtoDbMapping.PkMap)) { piMapList.Insert(0, dtoDbMapping.PkMap); } } using (DbCommand dbCommand = dbProvider.GetInsertDbCmd(dto, piMapList, this.GetSubTableArg <T>())) { try { dbCommand.Connection = GetDbConnection(); if ((dtoDbMapping.PkMap.PropertyType == typeof(int) || dtoDbMapping.PkMap.PropertyType == typeof(int?)) && (pkValue == null || (int)pkValue == 0)) { dbCommand.CommandText += ";" + dbProvider.GetAutoIdDbCommand().CommandText; object valueObj = dbCommand.ExecuteScalar(); if (valueObj == null || valueObj == DBNull.Value) { throw new Exception("插入记录失败."); } dtoDbMapping.PkMap.Pi.SetValue(dto, Convert.ToInt32(valueObj)); } else if ((dtoDbMapping.PkMap.PropertyType == typeof(long) || dtoDbMapping.PkMap.PropertyType == typeof(long?)) && (pkValue == null || (long)pkValue == 0)) { dbCommand.CommandText = $"{dbCommand.CommandText};{dbProvider.GetAutoIdDbCommand().CommandText}"; object valueObj = dbCommand.ExecuteScalar(); if (valueObj == null || valueObj == DBNull.Value) { throw new Exception("插入记录失败."); } dtoDbMapping.PkMap.Pi.SetValue(dto, Convert.ToInt64(valueObj)); } else { rowCount = dbCommand.ExecuteNonQuery(); if (rowCount <= 0) { throw new Exception("插入记录失败."); } } CloseDbConnection(dbCommand); } catch (Exception ex) { CloseDbConnection(dbCommand); throw ex; } } return(rowCount); }
/// <summary> /// Ctor /// </summary> /// <param name="dbContext">dbContext</param> /// <param name="subTableArg">分表参数</param> public IQuery(DbContext dbContext, string subTableArg = null) { ExHelper.ThrowIfNull(dbContext, "IQuery初始化失败,dbContext对象不能为空."); this.dbContext = dbContext; this.subTableArg = subTableArg; }