/// <summary> /// 快速删除数据,内部根据实体类的主键进行删除 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> public void QuickDelete <T>(List <T> list) where T : EntityBase, new() { List <object> idList = new List <object>(); T entity0 = list[0]; string tableName = entity0.GetTableName(); string pkName = entity0.PrimaryKeys[0]; foreach (T entity in list) { idList.Add(entity[pkName]); } List <DeletedPKIDEntity> dteList = new List <DeletedPKIDEntity>(); foreach (T entity in list) { object pkValue = entity[pkName]; DeletedPKIDEntity idEntity = new DeletedPKIDEntity(); if (pkValue is string) { idEntity.TargetID = 0; idEntity.TargetStringID = pkValue.ToString(); } else { idEntity.TargetID = Convert.ToInt64(pkValue); idEntity.TargetStringID = ""; } idEntity.TargetTableName = tableName; idEntity.DeletedTime = DateTime.Now; dteList.Add(idEntity); } OQL deleteQ = OQL.From(entity0) .Delete() .Where(cmp => cmp.Comparer(entity0[pkName], OQLCompare.CompareType.IN, idList.ToArray())) .END; AdoHelper db = this.OptDbContext.CurrentDataBase; EntityQuery <DeletedPKIDEntity> eq = new EntityQuery <DeletedPKIDEntity>(db); db.BeginTransaction(); try { int delCount = eq.ExecuteOql(deleteQ); int insCount = eq.QuickInsert(dteList); if (delCount != insCount) { throw new Exception("插入和删除的数据记录数不一样,删除数:" + delCount + ",插入数:" + insCount); } db.Commit(); } catch (Exception ex) { db.Rollback(); } }
private void Exporter_OnExported <T>(object sender, ExportEntityEventArgs <T> e) where T : EntityBase, new() { Console.WriteLine("------------------------------------------------------------"); if (e.Succeed) { //处理上次没有导入的剩余数据============================ //尝试加载本地数据,与导出的数据合并,以本次导出的数据优先 List <T> lastData = this.MemDB.LoadEntity <T>(); if (lastData != null && lastData.Count > 0) { string pkName = lastData[0].PrimaryKeys[0]; if (e.ExportedDataList.Count > 0) { object[] ids = e.ExportedDataList.Select(p => p[pkName]).ToArray(); var except = lastData.Where(p => !ids.Contains(p[pkName])).ToList(); e.ExportedDataList.AddRange(except); } else { e.ExportedDataList.AddRange(lastData); } } if (e.ExportedDataList.Count > 0) { if (e.EntityType == typeof(DeletedPKIDEntity)) { //ID记录表,导出后删除当前批次数据库记录 DeletedPKIDEntity entity = new DeletedPKIDEntity(); OQL q = OQL.From(entity) .Delete() .Where(cmp => cmp.Comparer(entity.BatchNumber, "=", e.BatchNumber)) .END; int count = EntityQuery <DeletedPKIDEntity> .ExecuteOql(q, CurrDbContext.CurrentDataBase); Console.WriteLine("当前导出批次{0} 已经清除当前的ID删除表信息记录,条数:{1}", e.BatchNumber, count); } else { //已经提前更新了导出批次号,参见 FilterQuery 方法 } this.HaveDataTableCount++; } Console.WriteLine("导出数据成功!\t 导出批次号:{0}\t 导出表名称:{1}\t 导出记录数:{2}", e.BatchNumber, e.ExportTable, e.ExportedDataList.Count); } else { Console.WriteLine("导出数据失败,\r\n 导出批次号:{0}\r\n 导出表名称:{1}\r\n 出错原因:{2}", e.BatchNumber, e.ExportTable, e.OperationExcepiton.Message); this.AllSucceed = false; } }