很多时间之长,,而今天我把Update篇也写一下,这对于批量处理数据很有帮助,它解决了EF与linq to sql批量更新数据上的效率问题。
对于EF架构中的批量更新操作,需要我们为实体的导航属性进行手动的标示,因为EF生成的实体中没有一个特殊的说明,所以,我们必须要告诉系统,哪个属性是导航属性,而导航属性是我们不去进行update的。
1 ///2 /// 属性的导航属性3 /// 4 public class NavigationAttribute : Attribute5 {6 7 }
而对于要进行批量更新的实体,我们需要为导航属性添加这个特性
1 public class User2 {3 public int UserID { get; set; }4 [Navigation]5 public User_Extension User_Extension { get; set; }6 }
而对于我们构建批量Update语句,请看代码,它需要对导航属性进行过滤
1 ///2 /// 构建Update语句串 3 /// 4 ///5 /// 6 /// 7 private Tuple CreateUpdateSQL (TEntity entity) where TEntity : class 8 { 9 if (entity == null)10 throw new ArgumentException("The database entity can not be null.");11 List pkList = GetPrimaryKey ().Select(i => i.Name).ToList();12 13 Type entityType = entity.GetType();14 var table = entityType.GetProperties().Where(i =>15 !pkList.Contains(i.Name)16 && i.GetValue(entity, null) != null17 && i.PropertyType != typeof(EntityState)18 && !(i.GetCustomAttributes(false).Length > 019 && i.GetCustomAttributes(false).Where(j => j.GetType() == typeof(NavigationAttribute)) != null)20 && (i.PropertyType.IsValueType || i.PropertyType == typeof(string)) //过滤导航属性21 ).ToArray();22 23 //过滤主键,航行属性,状态属性等24 if (pkList == null || pkList.Count == 0)25 throw new ArgumentException("The Table entity have not a primary key.");26 List
而对子类公开的Update方法,我们进行了一个封装,它通过操作枚举来确实你是要insert,update还是delete,看代码
1 ///2 /// 执行SQL,根据SQL操作的类型 3 /// 4 ///5 /// 6 /// 7 /// 8 protected string DoSQL (IEnumerable list, SQLType sqlType) where TEntity : class 9 {10 StringBuilder sqlstr = new StringBuilder();11 switch (sqlType)12 {13 case SQLType.Insert:14 list.ToList().ForEach(i =>15 {16 Tuple sql = CreateInsertSQL(i);17 sqlstr.AppendFormat(sql.Item1, sql.Item2);18 });19 break;20 case SQLType.Update:21 list.ToList().ForEach(i =>22 {23 Tuple sql = CreateUpdateSQL(i);24 sqlstr.AppendFormat(sql.Item1, sql.Item2);25 });26 break;27 case SQLType.Delete:28 list.ToList().ForEach(i =>29 {30 Tuple sql = CreateDeleteSQL(i);31 sqlstr.AppendFormat(sql.Item1, sql.Item2);32 });33 break;34 default:35 throw new ArgumentException("请输入正确的参数");36 }37 return sqlstr.ToString();38 }