LINQ删除之批量删除

时间:2024-03-18 14:00:48
开发工具与关键技术:Visual Studio 2015   LINQ
作者:孙水兵
撰写时间:2019年4月24

一、删除前期工作:
在控制器最上端引入Models和装实体类的文件名称
LINQ删除之批量删除
实例化Models
在控制器的命名空间中实例化Models
Models.CQUPTEntities 自定义名称 = new Models.CQUPTEntities();
LINQ删除之批量删除
二、 用到的方法
checkStatus:该方法可获取到表格所有的选中行相关数据 。
用法:初始化后Layui模块中的table模块.checkStatus(‘ID’),其中 ID 为操作表格的ID。
substring(): 该方法用于提取字符串中介于两个指定下标之间的字符。该方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。[0,studentIds.length-1)
Split():根据括号中的符号分割字符串,并以数组的形式返回
RemoveRange:删除多条数据

三、 批量删除
了解表格
在删除之前要先查看要删除的表格,知道哪些表格和自己要删除表格有联系,就比如我现在要删除的是用户表、学生表、用户角色明细表。LINQ删除之批量删除
四、分析
由于这里的批量删除涉及到多表的删除。而多表的删除几乎与单表的删除一致,唯一不同的是删除表格的顺序。
删除表格的顺序与新增表格的顺序相反
由上面表格的截图可知,在学生表、用户表、用户角色明细表中都存在用户ID,若新增学生表或用户角色明细表,可能导致其中的用户ID为null,而且先新增用户表之后才能将用户ID传入学生表、用户角色明细表中。因此,表格新增的顺序为:用户表->学生表->用户角色明细表(其中学生表和用户角色明细表新增顺序可以互换)。同理,在删除时,若先删除用户表,则在学生表、用户角色明细表中有某条数据中的用户ID找不到(用户表中删除的那条用户信息对应的用户ID)。(多表新增可见LINQ新增之多表新增)
结论:
表格新增的顺序为:用户表->学生表->用户角色明细表(其中学生表和用户角色明细表新增顺序可以互换)
因此在进行删除时删除表格的顺序为:学生表->用户角色明细表->用户表(其中学生表和用户角色明细表新增顺序可以互换,但若传入的参数为学生表中的,需先删除学生表)

五、代码解析
HTML
在合适的地方放置一个批量删除的按钮,并写上点击事件
JS部分
写一个批量删除的方法deleteexaminee(),写完后要记得去批量删除按钮那写点击事件。由于我这引用了Layui插件,因此获取选中行的数据用Layui插件来获取。声明一个变量checkStatus,使用初始化后Layui模块中的table模块。使用table模块checkStatus方法,获取到表格所有的选中行相关数据并用变量 checkStatus接收。判断是否获取到数据,若没获取到数据,输出:请选择需要删除的考生。若获取到数据(checkStatus.data.length > 0),声明一个空的变量studentIds,for循环上面得到的选中行的数据,用变量studentIds接收并以“;”拼接for循环后得到的数据中的学生ID(studentID)。然后在for循环外用substring()方法去掉最后一个“;”,不然在控制器中根据“;”分割时会导致返回的数组中的最后一个为空字符串。用Layui插件设置一个询问提示框,询问用户是否要删除选中的几条数据(checkStatus.data.length为选中数据的长度),然后在询问后要执行的方法中写一个参数(Index),用来记录询问提示框的,点击确定关闭询问提示框(layer.close(Index);)。继续往下执行,用post提交传入要删除数据的表格的主键ID(studentID)的集合(studentIds)。用msg接收控制器返回的数据,刷新表格,输出从控制器传过来的文本。

      //批量删除学生信息
       function deleteexaminee() {
           //获取选中行
           var checkStatus = layuiTable.checkStatus('tabStudent'); 
          
           //console.log(checkStatus.data) //获取选中行的数据
           //console.log(checkStatus.data.length) //获取选中行数量,可作为是否有选中行的条件
           //console.log(checkStatus.isAll) //表格是否全选
           if (checkStatus.data.length > 0) {
               var studentIds = "";
               //拼接ID值
               for (var i = 0; i < checkStatus.data.length; i++) {
                   studentIds += checkStatus.data[i].studentID + ";";
                   //console.log(studentIds);
               }
               //去掉最后的一个“;”
               //substring() 方法用于提取字符串中介于两个指定下标之间的字符。
               //substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。[0,studentIds.length-1)
               studentIds = studentIds.substring(0, studentIds.length - 1);
               //console.log(studentIds);
               layer.confirm("您确定要删除选中的" + checkStatus.data.length + "条学生信息?", { icon: 3, title: '提示' }, function (index) {
                   layer.close(index);
                   var layIndex = layer.load();
                   $.post("delStuInfo", { StudentID: studentIds },
                       function (msg) {
                           layer.close(layIndex);
                           //刷新表格
                           tabStudent.reload();
                           layer.alert(msg, { icon: 0, title: "提示" });
                   });
               }); 
           }
           else {
               layer.alert('请选择需要删除的考生!', { icon: 0, title: '提示' });
           }
       }

控制器代码
删除的核心语句:
实例化Models的名称.要删除的表格名称.RemoveRange(查询出要删除数据的列表(多条数据))
示例:myModels.PW_Student.RemoveRange(listStudent);
创建保存删除的方法DeletePoint,接收视图传过来的数据StudentID(要删除数据的表格的主键ID的集合)。声明返回文本的变量strMsg、声明记录删除成功、失败的变量countSuccessDel、countFaliedDel并设置其初始值为0。判断视图传过来的数据StudentID是否为空。为空,输出。不为空,将数据StudentID根据“;”分割并返回数组的形式用变量studentIds接收。声明三个列表对象(listStudent、listUserRoleDetail、listUser)分别用来接收foeach循环中从各自表格查询出来的数据。foeach循环studentIds,用string类型的studentId接收循环的数据。将string类型的studentId转化为Int32类型的studentID。根据Int32类型的studentID从数据库中的学生表(PW_Student)查出要删除的数据并用变量pwStudent接收,将从学生表中查询出来的要删除的数据加入到学生表的列表对象中。由于从数据库表格中查询数据用的是单条数据的查询(Single),所以要用try{} catch{}捕获异常,若出现异常,则说明删除失败,放入记录删除失败的变量countFaliedDel并设置其自增。将从学生表查询出来的数据中的用户ID取出用变量UserID接收。用得到的用户ID从用户角色明细表中查询出对应要删除的数据。将从用户角色明细表中查询出来的数据加入到用户角色明细表的列表对象中。继续用得到的用户ID从用户表中查询出对应要删除的数据。将从用户表中查询出来的数据加入到用户表的列表对象中。放入记录删除成功countSuccessDel,并设置其自增。在foreach循环外按删除表格的顺序依次删除表格相对应列表对象(注意:删除的是列表对象,是多条数据的删除,用RemoveRange)。然后保存。设置返回的文本为:总共删除了多少条学生信息!成功删除多少条学生信息,删除失败多少条学生信息。最后,用Json格式将returnJson返回,并设置允许请求。

   	 public ActionResult delStuInfo(string StudentID)
       {
           string strMsg = "failed";
           int countSuccessDel = 0;//记录删除成功的数据条数
           int countFaliedDel = 0;//记录删除失败的数据条数
           //判断参数是否为null或者为空
           if (!string.IsNullOrEmpty(StudentID))
           {
               //对拼接好的id进行分割
               string[] studentIds = StudentID.Split(';');

               //声明一个列表对象,用来接收foreach循环中的数据
               List<PW_Student> listStudent = new List<PW_Student>();
               List<PW_UserRoleDetail> listUserRoleDetail = new List<PW_UserRoleDetail>();
               List<PW_User> listUser = new List<PW_User>();
               foreach (string studentId in studentIds)   //遍历所有的id
               {
                   try
                   {
                       int studentID = Convert.ToInt32(studentId);//转化数据类型
                       //获取要删除的学生信息
                       PW_Student pwStudent = (from tbStudent in myModels.PW_Student
                                               where tbStudent.studentID == studentID
                                               select tbStudent).Single();

                       listStudent.Add(pwStudent);//将查询出来的数据加入学生表的列表对象中

                       var UserID = pwStudent.UserID;//获取删除学生的UserID

                       //获取要删除的用户角色明细表信息
                       PW_UserRoleDetail pwUserRoleDetail = (from tbUserRoleDetail in myModels.PW_UserRoleDetail
                                                             where tbUserRoleDetail.UserID == UserID
                                                             select tbUserRoleDetail).Single();

                       listUserRoleDetail.Add(pwUserRoleDetail);//将查询出来的数据加入用户角色明细表的列表对象中

                        //获取要删除的用户表信息
                       PW_User pwUser = (from tbUser in myModels.PW_User
                                         where tbUser.UserID == UserID
                                         select tbUser).Single();

                       listUser.Add(pwUser);//将查询出来的数据加入用户表的列表对象中
                       countSuccessDel++; //记录删除成功数据条数
                   }
                   catch (Exception e)
                   {
                       //数据异常时记录删除失败数据条数
                       countFaliedDel++;
                       Console.WriteLine(e);
                   }
               }
               myModels.PW_Student.RemoveRange(listStudent);
               myModels.PW_UserRoleDetail.RemoveRange(listUserRoleDetail);
               myModels.PW_User.RemoveRange(listUser);
               //保存数据库
               myModels.SaveChanges();

               strMsg = "总共删除" + studentIds.Length + "条学生信息!成功删除"+ countSuccessDel + "条学生信息,删除失败"+ countFaliedDel + "条学生信息。";
           }
           else
           {
               strMsg = "参数异常";
           }
           return Json(strMsg, JsonRequestBehavior.AllowGet);
       }