学习MVC时遇到批量修改 于是看到资料关于如下:
UI代码:
P05MODEL.User uModify = new P05MODEL.User() { uName = "AAA", uAddtime = DateTime.Now };//需要修改model中的两个字段 uNname和uAddtime bll.ModifyBy(uModify, u => u.uIsDel == true,"uName","uAddtime"); //调用批量修改
讲解:调用修改类变量讲解:
/// <param name="model">要修改的实体对象</param> /// <param name="proNames">要修改的 属性 名称</param> ModifyBy(P05MODEL.User model, Expression<Func<P05MODEL.User,bool>> whereLambda,params string[] modifiedProNames)
对应修改的model 用于查询那些数据修改 修改那些字段
DAL代码:
public int ModifyBy(P05MODEL.User model, Expression<Func<P05MODEL.User,bool>> whereLambda,params string[] modifiedProNames) { //4.1查询要修改的数据 List<P05MODEL.User> listModifing = db.Users.Where(whereLambda).ToList(); //获取 实体类 类型对象 Type t = typeof(P05MODEL.User); // model.GetType(); //获取 实体类 所有的 公有属性 List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList(); //创建 实体属性 字典集合 Dictionary<string, PropertyInfo> dictPros = new Dictionary<string, PropertyInfo>(); //将 实体属性 中要修改的属性名 添加到 字典集合中 键:属性名 值:属性对象 proInfos.ForEach(p => { if (modifiedProNames.Contains(p.Name)) { dictPros.Add(p.Name, p); } }); //4.3循环 要修改的属性名 foreach (string proName in modifiedProNames) { //判断 要修改的属性名是否在 实体类的属性集合中存在 if (dictPros.ContainsKey(proName)) { //如果存在,则取出要修改的 属性对象 PropertyInfo proInfo = dictPros[proName]; //取出 要修改的值 object newValue = proInfo.GetValue(model, null); //object newValue = model.uName; //4.4批量设置 要修改 对象的 属性 foreach (P05MODEL.User usrO in listModifing) { //为 要修改的对象 的 要修改的属性 设置新的值 proInfo.SetValue(usrO, newValue, null); //usrO.uName = newValue; } } } //4.4一次性 生成sql语句到数据库执行 return db.SaveChanges(); }
步骤如下:
1。通过whereLambda刷选到需要修改的数据存放到listModifing中
2。因为通过model并不知道那些字段数据需要进行了修改 所以通过model 获取 实体类 类型对象 再通过 获取 实体类 所有的 公有属性
最后放入字典中:将 实体属性 中要修改的属性名 添加到 字典集合中 键:属性名 值:属性对象
3。通过遍历反射形式把需要修改的对象中的字段一 一修改