33
44namespace ServiceStack . OrmLite . SqlServer
55{
6- public class SqlServerExpression < T > : SqlExpression < T >
7- {
6+ public class SqlServerExpression < T > : SqlExpression < T >
7+ {
88 public SqlServerExpression ( IOrmLiteDialectProvider dialectProvider )
99 : base ( dialectProvider ) { }
1010
1111 public override string ToUpdateStatement ( T item , bool excludeDefaults = false )
1212 {
13+ return SqlServerExpressionUtils . ToSqlServerUpdateStatement ( this , item , excludeDefaults ) ;
14+ }
15+
16+ public override string GetSubstringSql ( object quotedColumn , int startIndex , int ? length = null )
17+ {
18+ return length != null
19+ ? string . Format ( "substring({0}, {1}, {2})" , quotedColumn , startIndex , length . Value )
20+ : string . Format ( "substring({0}, {1}, LEN({0}) - {1} + 1)" , quotedColumn , startIndex ) ;
21+ }
22+
23+ public override SqlExpression < T > OrderByRandom ( )
24+ {
25+ return base . OrderBy ( "NEWID()" ) ;
26+ }
27+ }
28+
29+ public class SqlServerParameterizedSqlExpression < T > : ParameterizedSqlExpression < T >
30+ {
31+ public SqlServerParameterizedSqlExpression ( IOrmLiteDialectProvider dialectProvider )
32+ : base ( dialectProvider ) { }
33+
34+ public override string ToUpdateStatement ( T item , bool excludeDefaults = false )
35+ {
36+ return SqlServerExpressionUtils . ToSqlServerUpdateStatement ( this , item , excludeDefaults ) ;
37+ }
38+
39+ public override string GetSubstringSql ( object quotedColumn , int startIndex , int ? length = null )
40+ {
41+ return length != null
42+ ? string . Format ( "substring({0}, {1}, {2})" , quotedColumn , startIndex , length . Value )
43+ : string . Format ( "substring({0}, {1}, LEN({0}) - {1} + 1)" , quotedColumn , startIndex ) ;
44+ }
45+
46+ public override SqlExpression < T > OrderByRandom ( )
47+ {
48+ return base . OrderBy ( "NEWID()" ) ;
49+ }
50+
51+ protected override void ConvertToPlaceholderAndParameter ( ref object right )
52+ {
53+ var paramName = Params . Count . ToString ( ) ;
54+ var paramValue = right ;
55+ var parameter = CreateParam ( paramName , paramValue ) ;
56+
57+ // Prevents a new plan cache for each different string length. Every string is parameterized as NVARCHAR(max)
58+ if ( parameter . DbType == System . Data . DbType . String )
59+ parameter . Size = - 1 ;
60+
61+ Params . Add ( parameter ) ;
62+
63+ right = parameter . ParameterName ;
64+ }
65+ }
66+
67+ internal class SqlServerExpressionUtils
68+ {
69+ internal static string ToSqlServerUpdateStatement < T > ( SqlExpression < T > q , T item , bool excludeDefaults = false )
70+ {
71+ var modelDef = q . ModelDef ;
72+ var dialectProvider = q . DialectProvider ;
73+
1374 var setFields = new StringBuilder ( ) ;
1475
15- foreach ( var fieldDef in ModelDef . FieldDefinitions )
76+ foreach ( var fieldDef in modelDef . FieldDefinitions )
1677 {
1778 if ( fieldDef . ShouldSkipUpdate ( ) ) continue ;
1879 if ( fieldDef . IsRowVersion ) continue ;
19- if ( UpdateFields . Count > 0
20- && ! UpdateFields . Contains ( fieldDef . Name )
21- || fieldDef . AutoIncrement ) continue ; // added
80+ if ( q . UpdateFields . Count > 0
81+ && ! q . UpdateFields . Contains ( fieldDef . Name )
82+ || fieldDef . AutoIncrement )
83+ continue ; // added
2284
2385 var value = fieldDef . GetValue ( item ) ;
2486 if ( excludeDefaults
2587 && ( value == null || ( ! fieldDef . IsNullable && value . Equals ( value . GetType ( ) . GetDefaultValue ( ) ) ) ) )
2688 continue ;
2789
28- fieldDef . GetQuotedValue ( item , DialectProvider ) ;
90+ fieldDef . GetQuotedValue ( item , dialectProvider ) ;
2991
30- if ( setFields . Length > 0 )
92+ if ( setFields . Length > 0 )
3193 setFields . Append ( ", " ) ;
3294
3395 setFields
34- . Append ( DialectProvider . GetQuotedColumnName ( fieldDef . FieldName ) )
96+ . Append ( dialectProvider . GetQuotedColumnName ( fieldDef . FieldName ) )
3597 . Append ( "=" )
36- . Append ( DialectProvider . GetQuotedValue ( value , fieldDef . FieldType ) ) ;
98+ . Append ( dialectProvider . GetQuotedValue ( value , fieldDef . FieldType ) ) ;
3799 }
38100
39101 if ( setFields . Length == 0 )
40102 throw new ArgumentException ( "No non-null or non-default values were provided for type: " + typeof ( T ) . Name ) ;
41103
42104 return string . Format ( "UPDATE {0} SET {1} {2}" ,
43- base . DialectProvider . GetQuotedTableName ( ModelDef ) , setFields , WhereExpression ) ;
105+ dialectProvider . GetQuotedTableName ( modelDef ) , setFields , q . WhereExpression ) ;
44106 }
45-
46- public override string GetSubstringSql ( object quotedColumn , int startIndex , int ? length = null )
47- {
48- return length != null
49- ? string . Format ( "substring({0}, {1}, {2})" , quotedColumn , startIndex , length . Value )
50- : string . Format ( "substring({0}, {1}, LEN({0}) - {1} + 1)" , quotedColumn , startIndex ) ;
51- }
52-
53- public override SqlExpression < T > OrderByRandom ( )
54- {
55- return base . OrderBy ( "NEWID()" ) ;
56- }
57- }
107+ }
58108}
0 commit comments