比如一个用户表有20个字段来储存用户信息,这些信息用户在一个页面可以统一修改,那么用户post的时候,有什么方便的办法可以知道用户修改了那些字段(正常情况下,一般一次修改的字段值只有几个)
把post过来的这个model和这个用户本身信息(根据用户id获取)的model用linq进行比较
请问具体怎么实现呢?
我写了下列代码,不知道这算不算是用linq 进行比较:
/// <summary> /// 找出实体被修改盗字段 /// </summary> public class FindPropertiesChanged { /// <summary> /// 找出实体被修改盗字段 /// </summary> /// <param name="before">修改前实体</param> /// <param name="after">修改后实体</param> /// <returns>修改内容</returns> public static String Find(object before,object after) { StringBuilder sb = new StringBuilder(); sb.Append(""); PropertyInfo[] beforepropertys = before.GetType().GetProperties(); PropertyInfo[] afterpropertys = after.GetType().GetProperties(); //linq的方式 var post = afterpropertys.Where(s => s.GetValue(after) != null); foreach(var a in post) { var changed = beforepropertys.Where(s => s.Name == a.Name && s.GetValue(before) != null && s.GetValue(before) != a.GetValue(after)).FirstOrDefault(); if (changed!=null) { //修改记录
sb.Append(changed.Name + ":" + changed.GetValue(before) + "->" + a.Name + ":" + a.GetValue(after) + ";"); } } return sb.ToString(); } }
@泰德: 这个也勉强算是吧, 你如果能将这个foreach有效的和where结合在一起,那就回让代码更简洁 。 不过这样也行, 可读性会好一些。
@请叫我头头哥:
"foreach有效的和where结合在一起"
这个怎么结合?
@泰德: Linq有自带的foreach
写点代码对比还算方便,如果要更方便的,也是有的,那就是叫别人做这事,最方便了。
当用户修改了信息, 用一个临时集合存放修改了的信息,提交的时候对临时集合进行处理
请问具体怎么实现呢?
如果容易将横向数据结构,变成纵向数据结构:
字段名 字段值
ID 100001
这样的话,用linq的except方法就很容易找到改变的数据了。
这样倒是方便找出那些字段修改了,但是不方便找出改为什么了