在维护项目的时候,突然看见Human模块批量删除功能有点小瑕疵,具体的业务逻辑是这样的:在datagrid中获取多条教师的id,然后传给后台Controller进行拆分,最后经拆分后的id保存到数组中传递给Service层,调用底层封装好的删除方法(软删除),进行逐条删除。
之前Controller是这样个逻辑,获取一条id,调用一次服务,访问一次数据库,删除一条数据,那么我如果想删除100条数据的话,就应该调用100次服务,访问100次数据库,然后再删除100条数据,感觉这样的代码太“欠抽了”,于是自己想优化一下,做一些行动下移的事情,积累一下自己的代码量。
我现在想改成这样的业务逻辑:调用一次服务,访问一次数据库,删除多条数据。
前台界面如下所示
JS代码:获取要删除数据的ID(批量删除)
function Delete() {
//获取选中行的数据,返回的是数组
var selectRows = $('#dg').datagrid('getSelections');
//如果没有选中行的话,提示信息
if (selectRows.length < 1) {
$.messager.alert('人事管理', '请选中要删除的人事记录', 'warning');
return;
}
//如果选中行了,则要进行判断
$.messager.confirm('人事管理', '确认要删除吗!删除之后,则不能恢复!', function (isDelete) {
//如果为真的话
if (isDelete) {
//定义变量值
var strIds = "";
for (var i = 0; i < selectRows.length; i++) {
strIds += selectRows[i].TeacherID + ',';
}
strIds = strIds.substr(0, strIds.length - 1);
$.post('/Personnal/DeleteTeacher?TeacherID=' + strIds, function (jsonObj) {
if (jsonObj > 0) {
$.messager.show({
title: '提示',
msg: '教师删除成功!',
timeout: 5000,
showType: 'slide'
});
$('#dg').datagrid('reload');//删除成功后 刷新页面
}
else {
$.messager.alert('人事管理', '删除操作未能完全执行。请稍后再试!', 'warning');
}
}, 'JSON');
}
});
}
Controller代码
public int DeleteTeacher()
{
int YorN = 1; // 默认成功!
bool isDeleted;
try
{
string delTeacherID = Request.QueryString["TeacherID"]; //获取将要删除的教师信息的教工号
string[] TeacherIDs = delTeacherID.Split(','); //逗号分隔符
BasicTeacherViewModel enteacher = new BasicTeacherViewModel();
isDeleted = TeacherService.ModifyTeacher(enteacher, TeacherIDs); //调用修改职工号信息,将IsEnabled设置为0.不可用
if (!isDeleted)
{
YorN = 0;
}
}
catch (Exception ex)
{
throw ex;
}
return YorN;//返回1,证明修改成功
}
服务端代码(B层)
public bool ModifyTeacher(BasicTeacherViewModel enteacher, string[] proNames)
{
try
{
for (int i = 0; i < proNames.Length; i++)
{
BasicTeacherEntities enTeacher = new BasicTeacherEntities();
Guid EditTeacherID = new Guid(proNames[i]);
{
enTeacher.TeacherID = EditTeacherID;
enTeacher.IsEnabled = 0;
};
this.CurrentDal.Update(enTeacher, "IsEnabled");//根据职工号修改教师信息,
}
return this.DbSession.SaveChanges() > 0; //如果大于0,返回true
}
catch (Exception ex)
{
throw ex;
}
}
由于底层封装的Update的方法是根据实体来更新数据,所以我们更新的时候要创建一个教师的实体,但是在最后的代码中,每次的循环都创建一个BasicTeacherEntities,这样无疑给内存增加压力,曾尝试BasicTeacherEntities实体的实例化放在for循环外面,但是前台传来多条数据之后,for循环执行两次就结束了,这不知道为什么?自己继续研究吧....