@@ -332,23 +332,25 @@ protected virtual SqlResult CompileUpdateQuery(Query query)
332332
333333
334334 var toUpdate = ctx . Query . GetOneComponent < InsertClause > ( "update" , EngineCode ) ;
335- var parts = new List < string > ( ) ;
335+ var parts = new StringBuilder ( toUpdate . Data . Count ) ;
336336
337- for ( var i = 0 ; i < toUpdate . Columns . Count ; i ++ )
337+ var separator = ", " ;
338+
339+ foreach ( var item in toUpdate . Data )
338340 {
339- parts . Add ( Wrap ( toUpdate . Columns [ i ] ) + " = " + Parameter ( ctx , toUpdate . Values [ i ] ) ) ;
341+ parts . Append ( Wrap ( item . Key ) + " = " + Parameter ( ctx , item . Value ) + separator ) ;
340342 }
341343
342- var sets = string . Join ( ", " , parts ) ;
343-
344+ parts . Length -= separator . Length ;
345+
344346 wheres = CompileWheres ( ctx ) ;
345347
346348 if ( ! string . IsNullOrEmpty ( wheres ) )
347349 {
348350 wheres = " " + wheres ;
349351 }
350352
351- ctx . RawSql = $ "UPDATE { table } SET { sets } { wheres } ";
353+ ctx . RawSql = $ "UPDATE { table } SET { parts } { wheres } ". Trim ( ) ;
352354
353355 return ctx ;
354356 }
@@ -392,16 +394,18 @@ protected virtual SqlResult CompileInsertQuery(Query query)
392394
393395 var inserts = ctx . Query . GetComponents < AbstractInsertClause > ( "insert" , EngineCode ) ;
394396
397+ var sql = new StringBuilder ( inserts . Count + 1 ) ;
398+
395399 if ( inserts [ 0 ] is InsertClause insertClause )
396400 {
397- var columns = string . Join ( ", " , WrapArray ( insertClause . Columns ) ) ;
398- var values = string . Join ( ", " , Parameterize ( ctx , insertClause . Values ) ) ;
401+ var columns = string . Join ( ", " , WrapArray ( insertClause . Data . Keys ) ) ;
402+ var values = string . Join ( ", " , Parameterize ( ctx , insertClause . Data . Values ) ) ;
399403
400- ctx . RawSql = $ "INSERT INTO { table } ({ columns } ) VALUES ({ values } )";
404+ sql . Append ( $ "INSERT INTO { table } ({ columns } ) VALUES ({ values } )") ;
401405
402406 if ( insertClause . ReturnId && ! string . IsNullOrEmpty ( LastId ) )
403407 {
404- ctx . RawSql += ";" + LastId ;
408+ sql . Append ( ";" + LastId ) ;
405409 }
406410 }
407411 else
@@ -418,7 +422,7 @@ protected virtual SqlResult CompileInsertQuery(Query query)
418422 var subCtx = CompileSelectQuery ( clause . Query ) ;
419423 ctx . Bindings . AddRange ( subCtx . Bindings ) ;
420424
421- ctx . RawSql = $ "INSERT INTO { table } { columns } { subCtx . RawSql } ";
425+ sql . Append ( $ "INSERT INTO { table } { columns } { subCtx . RawSql } ") ;
422426 }
423427
424428 if ( inserts . Count > 1 )
@@ -427,11 +431,11 @@ protected virtual SqlResult CompileInsertQuery(Query query)
427431 {
428432 var clause = insert as InsertClause ;
429433
430- ctx . RawSql += ", (" + string . Join ( ", " , Parameterize ( ctx , clause . Values ) ) + ")" ;
431-
434+ sql . Append ( ", (" + string . Join ( ", " , Parameterize ( ctx , clause . Data . Values ) ) + ")" ) ;
432435 }
433436 }
434437
438+ ctx . RawSql = sql . ToString ( ) . Trim ( ) ;
435439
436440 return ctx ;
437441 }
@@ -442,7 +446,7 @@ protected virtual SqlResult CompileCteQuery(SqlResult ctx, Query query)
442446 var cteFinder = new CteFinder ( query , EngineCode ) ;
443447 var cteSearchResult = cteFinder . Find ( ) ;
444448
445- var rawSql = new StringBuilder ( "WITH " ) ;
449+ var rawSql = new StringBuilder ( "WITH " , cteSearchResult . Count * 2 + 3 ) ;
446450 var cteBindings = new List < object > ( ) ;
447451
448452 foreach ( var cte in cteSearchResult )
@@ -459,7 +463,7 @@ protected virtual SqlResult CompileCteQuery(SqlResult ctx, Query query)
459463 rawSql . Append ( ctx . RawSql ) ;
460464
461465 ctx . Bindings . InsertRange ( 0 , cteBindings ) ;
462- ctx . RawSql = rawSql . ToString ( ) ;
466+ ctx . RawSql = rawSql . ToString ( ) . Trim ( ) ;
463467
464468 return ctx ;
465469 }
@@ -585,7 +589,7 @@ public virtual string CompileUnion(SqlResult ctx)
585589 return null ;
586590 }
587591
588- var combinedQueries = new List < string > ( ) ;
592+ var combinedQueries = new StringBuilder ( ) ;
589593
590594 var clauses = ctx . Query . GetComponents < AbstractCombine > ( "combine" , EngineCode ) ;
591595
@@ -599,21 +603,19 @@ public virtual string CompileUnion(SqlResult ctx)
599603
600604 ctx . Bindings . AddRange ( subCtx . Bindings ) ;
601605
602- combinedQueries . Add ( $ "{ combineOperator } { subCtx . RawSql } ") ;
606+ combinedQueries . Append ( $ "{ combineOperator } { subCtx . RawSql } ") ;
603607 }
604608 else
605609 {
606610 var combineRawClause = clause as RawCombine ;
607611
608612 ctx . Bindings . AddRange ( combineRawClause . Bindings ) ;
609613
610- combinedQueries . Add ( WrapIdentifiers ( combineRawClause . Expression ) ) ;
611-
614+ combinedQueries . Append ( WrapIdentifiers ( combineRawClause . Expression ) + " " ) ;
612615 }
613616 }
614617
615- return string . Join ( " " , combinedQueries ) ;
616-
618+ return combinedQueries . ToString ( ) . Trim ( ) ;
617619 }
618620
619621 public virtual string CompileTableExpression ( SqlResult ctx , AbstractFrom from )
@@ -745,7 +747,7 @@ public virtual string CompileHaving(SqlResult ctx)
745747 return null ;
746748 }
747749
748- var sql = new List < string > ( ) ;
750+ var sql = new StringBuilder ( ) ;
749751 string boolOperator ;
750752
751753 var having = ctx . Query . GetComponents ( "having" , EngineCode )
@@ -760,11 +762,11 @@ public virtual string CompileHaving(SqlResult ctx)
760762 {
761763 boolOperator = i > 0 ? having [ i ] . IsOr ? "OR " : "AND " : "" ;
762764
763- sql . Add ( boolOperator + compiled ) ;
765+ sql . Append ( boolOperator + compiled + " " ) ;
764766 }
765767 }
766768
767- return $ "HAVING { string . Join ( " " , sql ) } " ;
769+ return $ "HAVING { sql } " . Trim ( ) ;
768770 }
769771
770772 public virtual string CompileLimit ( SqlResult ctx )
@@ -958,9 +960,9 @@ public virtual string Parameterize<T>(SqlResult ctx, IEnumerable<T> values)
958960 /// </summary>
959961 /// <param name="values"></param>
960962 /// <returns></returns>
961- public virtual List < string > WrapArray ( List < string > values )
963+ public virtual IEnumerable < string > WrapArray ( IEnumerable < string > values )
962964 {
963- return values . Select ( x => Wrap ( x ) ) . ToList ( ) ;
965+ return values . Select ( Wrap ) ;
964966 }
965967
966968 public virtual string WrapIdentifiers ( string input )
0 commit comments