3
3
4
4
namespace ServiceStack . OrmLite . SqlServer
5
5
{
6
- public class SqlServerExpression < T > : SqlExpression < T >
7
- {
6
+ public class SqlServerExpression < T > : SqlExpression < T >
7
+ {
8
8
public SqlServerExpression ( IOrmLiteDialectProvider dialectProvider )
9
9
: base ( dialectProvider ) { }
10
10
11
11
public override string ToUpdateStatement ( T item , bool excludeDefaults = false )
12
12
{
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
+
13
74
var setFields = new StringBuilder ( ) ;
14
75
15
- foreach ( var fieldDef in ModelDef . FieldDefinitions )
76
+ foreach ( var fieldDef in modelDef . FieldDefinitions )
16
77
{
17
78
if ( fieldDef . ShouldSkipUpdate ( ) ) continue ;
18
79
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
22
84
23
85
var value = fieldDef . GetValue ( item ) ;
24
86
if ( excludeDefaults
25
87
&& ( value == null || ( ! fieldDef . IsNullable && value . Equals ( value . GetType ( ) . GetDefaultValue ( ) ) ) ) )
26
88
continue ;
27
89
28
- fieldDef . GetQuotedValue ( item , DialectProvider ) ;
90
+ fieldDef . GetQuotedValue ( item , dialectProvider ) ;
29
91
30
- if ( setFields . Length > 0 )
92
+ if ( setFields . Length > 0 )
31
93
setFields . Append ( ", " ) ;
32
94
33
95
setFields
34
- . Append ( DialectProvider . GetQuotedColumnName ( fieldDef . FieldName ) )
96
+ . Append ( dialectProvider . GetQuotedColumnName ( fieldDef . FieldName ) )
35
97
. Append ( "=" )
36
- . Append ( DialectProvider . GetQuotedValue ( value , fieldDef . FieldType ) ) ;
98
+ . Append ( dialectProvider . GetQuotedValue ( value , fieldDef . FieldType ) ) ;
37
99
}
38
100
39
101
if ( setFields . Length == 0 )
40
102
throw new ArgumentException ( "No non-null or non-default values were provided for type: " + typeof ( T ) . Name ) ;
41
103
42
104
return string . Format ( "UPDATE {0} SET {1} {2}" ,
43
- base . DialectProvider . GetQuotedTableName ( ModelDef ) , setFields , WhereExpression ) ;
105
+ dialectProvider . GetQuotedTableName ( modelDef ) , setFields , q . WhereExpression ) ;
44
106
}
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
+ }
58
108
}
0 commit comments