好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

LINQ-to-SQL那点事~利用反射在LINQ-to-SQL环境中实现Ado.net的CU

回到目录 对于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的详细内容...

  阅读:40次