回到目录 对于linq to sql提供的CURD 操作 ,给我们的感觉就是简单,容易使用,更加面向对象,不用拼SQL语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合实体,希望进行update 操作 ,如果你还用linq to sql提代的updat
回到目录
对于linq to sql提供的CURD 操作 ,给我们的感觉就是简单,容易使用,更加面向对象,不用拼SQL语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合实体,希望进行update 操作 ,如果你还用linq to sql提代的update,那你服务器就快要挂了,呵呵。
为什么呢?
对于LINQ提借的命令,如update(list), 它会把list进行foreache的遍历,然后一条一条指令的向SQLSERVER发送 ,好家伙,这要是1000,1W条实体的集合,进行update 操作 ,这个对IO的开销和服务器的性能来说都是没法接受的,呵呵,应该是一个SQL链接,一个指令,就能解决问题呀!
自己封套性能更好的CURD集合 操作 (选自我的entity framework架构,linq to sql没来的及 实现 )
/// /// SQL 操作 类型 /// protected enum SQLType { Insert, Update, Delete, } /// /// 构建Update语句串 /// /// /// /// private Tuple string , object []> CreateUpdateSQL (TEntity entity) where TEntity : class { if (entity == null ) throw new ArgumentException( " The database entity can not be null. " ); List string > pkList = GetPrimaryKey ().Select(i => i.Name).ToList(); Type entityType = entity.GetType(); var table = entityType.GetProperties().Where(i => ! pkList.Contains(i.Name) && i.GetValue(entity, null ) != null && i.PropertyType != typeof (EntityState) && !(i.GetCustomAttributes( false ).Length > 0 && i.GetCustomAttributes( false ).Where(j => j.GetType() == typeof (NavigationAttribute)) != null ) && (i.PropertyType.IsValueType || i.PropertyType == typeof ( string )) // 过滤导航属性 ).ToArray(); // 过滤主键,航行属性,状态属性等 if (pkList == null || pkList.Count == 0 ) throw new ArgumentException( " The Table entity have not a primary key. " ); List object > arguments = new List object > (); StringBuilder builder = new StringBuilder(); foreach ( var change in table) { if (pkList.Contains(change.Name)) continue ; if (arguments.Count != 0 ) builder.Append( " , " ); builder.Append(change.Name + " = { " + arguments.Count + " } " ); if (change.PropertyType == typeof ( string ) || change.PropertyType == typeof (DateTime)) arguments.Add( " ' " + change.GetValue(entity, null ).ToString().Replace( " ' " , " char(39) " ) + " ' " ); else arguments.Add(change.GetValue(entity, null )); } if (builder.Length == 0 ) throw new Exception( " 没有任何属性进行更新 " ); builder.Insert( 0 , " UPDATE " + string .Format( " [{0}] " , entityType.Name) + " SET " ); builder.Append( " WHERE " ); bool firstPrimaryKey = true ; foreach ( var primaryField in pkList) { if (firstPrimaryKey) firstPrimaryKey = false ; else builder.Append( " AND " ); object val = entityType.GetProperty(primaryField).GetValue(entity, null ); builder.Append(GetEqualStatment(primaryField, arguments.Count)); arguments.Add(val); } return new Tuple string , object []> (builder.ToString(), arguments.ToArray()); } /// /// 构建Delete语句串 /// /// /// /// private Tuple string , object []> CreateDeleteSQL (TEntity entity) where TEntity : class { if (entity == null ) throw new ArgumentException( " The database entity can not be null. " ); Type entityType = entity.GetType(); List string > pkList = GetPrimaryKey ().Select(i => i.Name).ToList(); if (pkList == null || pkList.Count == 0 ) throw new ArgumentException( " The Table entity have not a primary key. " ); List object > arguments = new List object > (); StringBuilder builder = new StringBuilder(); builder.Append( " Delete from " + string .Format( " [{0}] " , entityType.Name)); builder.Append( " WHERE " ); bool firstPrimaryKey = true ; foreach ( var primaryField in pkList) { if (firstPrimaryKey) firstPrimaryKey = false ; else builder.Append( " AND " ); object val = entityType.GetProperty(primaryField).GetValue(entity, null ); builder.Append(GetEqualStatment(primaryField, arguments.Count)); arguments.Add(val); } return new Tuple string , object []> (builder.ToString(), arguments.ToArray()); } /// /// 构建Insert语句串 /// 主键为自增时,如果主键值为0,我们将主键插入到SQL串中 /// /// /// /// private Tuple string , object []> CreateInsertSQL (TEntity entity) where TEntity : class { if (entity == null ) throw new ArgumentException( " The database entity can not be null. " ); Type entityType = entity.GetType(); var table = entityType.GetProperties().Where(i => i.PropertyType != typeof (EntityKey) && i.PropertyType != typeof (EntityState) && i.Name != " IsValid " && i.GetValue(entity, null ) != null && !(i.GetCustomAttributes( false ).Length > 0 && i.GetCustomAttributes( false ).Where(j => j.GetType() == typeof (NavigationAttribute)) != null ) && (i.PropertyType.IsValueType || i.PropertyType == typeof ( string ))).ToArray(); // 过滤主键,航行属性,状态属性等 List string > pkList = GetPrimaryKey ().Select(i => i.Name).ToList(); List object > arguments = new List object > (); StringBuilder fieldbuilder = new StringBuilder(); StringBuilder valuebuilder = new StringBuilder(); fieldbuilder.Append( " INSERT INTO " + string .Format( " [{0}] " , entityType.Name) + " ( " ); foreach ( var member in table) { if (pkList.Contains(member.Name) && Convert.ToString(member.GetValue(entity, null )) == " 0 " ) continue ; object value = member.GetValue(entity, null ); if (value != null ) { if (arguments.Count != 0 ) { fieldbuilder.Append( " , " ); valuebuilder.Append( " , " ); } fieldbuilder.Append(member.Name); if (member.PropertyType == typeof ( string ) || member.PropertyType == typeof (DateTime)) valuebuilder.Append( " '{ " + arguments.Count + " }' " ); else valuebuilder.Append( " { " + arguments.Count + " } " ); if (value.GetType() == typeof ( string )) value = value.ToString().Replace( " ' " , " char(39) " ); arguments.Add(value); } } fieldbuilder.Append( " ) Values ( " ); fieldbuilder.Append(valuebuilder.ToString()); fieldbuilder.Append( " ); " ); return new Tuple string , object []> (fieldbuilder.ToString(), arguments.ToArray()); } /// /// 执行SQL,根据SQL 操作 的类型 /// /// /// /// /// protected string DoSQL (IEnumerable list, SQLType sqlType) where TEntity : class { StringBuilder sqlstr = new StringBuilder(); switch (sqlType) { case SQLType.Insert: list.ToList().ForEach(i => { Tuple string , object []> sql = CreateInsertSQL(i); sqlstr.AppendFormat(sql.Item1, sql.Item2); }); break ; case SQLType.Update: list.ToList().ForEach(i => { Tuple string , object []> sql = CreateUpdateSQL(i); sqlstr.AppendFormat(sql.Item1, sql.Item2); }); break ; case SQLType.Delete: list.ToList().ForEach(i => { Tuple string , object []> sql = CreateDeleteSQL(i); sqlstr.AppendFormat(sql.Item1, sql.Item2); }); break ; default : throw new ArgumentException( " 请输入正确的参数 " ); } return sqlstr.ToString(); }
前方永远都是通往成功的路,只要你相信,它就会更快的 实现 ...
回到目录
查看更多关于LINQ-to-SQL那点事~利用反射在LINQ-to-SQL环境中实现Ado.net的CU的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did158547