1
- using System ;
2
1
using System . Text ;
3
2
4
3
namespace ServiceStack . OrmLite . SqlServer
5
4
{
6
5
public class SqlServerExpression < T > : SqlExpression < T >
7
6
{
8
- public override string ToSelectStatement ( )
9
- {
10
- if ( ! Offset . HasValue && ! Rows . HasValue )
11
- return base . ToSelectStatement ( ) ;
12
-
13
- AssertValidSkipRowValues ( ) ;
14
-
15
- var skip = Offset . HasValue ? Offset . Value : 0 ;
16
- var take = Rows . HasValue ? Rows . Value : int . MaxValue ;
17
-
18
- var sql = "" ;
19
-
20
- //Temporary hack till we come up with a more robust paging sln for SqlServer
21
- if ( skip == 0 )
22
- {
23
- if ( take == int . MaxValue )
24
- return base . ToSelectStatement ( ) ;
25
-
26
- sql = base . ToSelectStatement ( ) ;
27
- if ( sql == null || sql . Length < "SELECT" . Length ) return sql ;
28
- var selectType = sql . StartsWithIgnoreCase ( "SELECT DISTINCT" ) ? "SELECT DISTINCT" : "SELECT" ;
29
- sql = selectType + " TOP " + take + sql . Substring ( selectType . Length , sql . Length - selectType . Length ) ;
30
- return sql ;
31
- }
32
-
33
- var orderBy = ! String . IsNullOrEmpty ( OrderByExpression )
34
- ? OrderByExpression
35
- : BuildOrderByIdExpression ( ) ;
36
-
37
- OrderByExpression = String . Empty ; // Required because ordering is done by Windowing function
38
-
39
- //todo: review needed only check against sql server 2008 R2
40
- var tableName = OrmLiteConfig . DialectProvider . GetQuotedTableName ( ModelDef ) . Trim ( ) ; //2
41
- var statement = string . Format ( "{0} {1} {2}" , WhereExpression , GroupByExpression , HavingExpression ) . Trim ( ) ;
42
-
43
- var retVal = string . Format (
44
- "{0} FROM (SELECT ROW_NUMBER() OVER ({1}) As RowNum, * FROM {2} {3}) AS RowConstrainedResult WHERE RowNum > {4} AND RowNum <= {5}" ,
45
- SelectExpression ,
46
- orderBy ,
47
- tableName ,
48
- statement ,
49
- skip ,
50
- skip + take ) ;
51
-
52
- return retVal ;
53
- }
54
-
55
7
public override SqlExpression < T > Clone ( )
56
8
{
57
9
return CopyTo ( new SqlServerExpression < T > ( ) ) ;
@@ -81,30 +33,5 @@ public override string ToUpdateStatement(T item, bool excludeDefaults = false)
81
33
return string . Format ( "UPDATE {0} SET {1} {2}" ,
82
34
dialectProvider . GetQuotedTableName ( ModelDef ) , setFields , WhereExpression ) ;
83
35
}
84
-
85
- protected virtual void AssertValidSkipRowValues ( )
86
- {
87
- if ( Offset . HasValue && Offset . Value < 0 )
88
- throw new ArgumentException ( String . Format ( "Skip value:'{0}' must be>=0" , Offset . Value ) ) ;
89
-
90
- if ( Rows . HasValue && Rows . Value < 0 )
91
- throw new ArgumentException ( string . Format ( "Rows value:'{0}' must be>=0" , Rows . Value ) ) ;
92
- }
93
-
94
- protected virtual string BuildOrderByIdExpression ( )
95
- {
96
- if ( ModelDef . PrimaryKey == null )
97
- throw new ApplicationException ( "Malformed model, no PrimaryKey defined" ) ;
98
-
99
- return String . Format ( "ORDER BY {0}" , OrmLiteConfig . DialectProvider . GetQuotedColumnName ( ModelDef . PrimaryKey . FieldName ) ) ;
100
- }
101
-
102
- public override string LimitExpression
103
- {
104
- get
105
- {
106
- return "" ;
107
- }
108
- }
109
36
}
110
37
}
0 commit comments