Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 4207171

Browse files
committed
Refactor SqlServerExpression to use DialectProvider
1 parent f45700e commit 4207171

File tree

2 files changed

+58
-73
lines changed

2 files changed

+58
-73
lines changed
Lines changed: 0 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,9 @@
1-
using System;
21
using System.Text;
32

43
namespace ServiceStack.OrmLite.SqlServer
54
{
65
public class SqlServerExpression<T> : SqlExpression<T>
76
{
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-
557
public override SqlExpression<T> Clone()
568
{
579
return CopyTo(new SqlServerExpression<T>());
@@ -81,30 +33,5 @@ public override string ToUpdateStatement(T item, bool excludeDefaults = false)
8133
return string.Format("UPDATE {0} SET {1} {2}",
8234
dialectProvider.GetQuotedTableName(ModelDef), setFields, WhereExpression);
8335
}
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-
}
10936
}
11037
}

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,5 +361,63 @@ public override string GetColumnDefinition(string fieldName, Type fieldType, boo
361361

362362
return definition;
363363
}
364+
365+
public override string ToSelectStatement(ModelDefinition modelDef,
366+
string selectExpression,
367+
string bodyExpression,
368+
string orderByExpression = null,
369+
int? offset = null,
370+
int? rows = null)
371+
{
372+
var sb = new StringBuilder(selectExpression);
373+
sb.Append(bodyExpression);
374+
375+
if (!offset.HasValue && !rows.HasValue)
376+
return sb + orderByExpression;
377+
378+
if (offset.HasValue && offset.Value < 0)
379+
throw new ArgumentException(string.Format("Skip value:'{0}' must be>=0", offset.Value));
380+
381+
if (rows.HasValue && rows.Value < 0)
382+
throw new ArgumentException(string.Format("Rows value:'{0}' must be>=0", rows.Value));
383+
384+
var skip = offset.HasValue ? offset.Value : 0;
385+
var take = rows.HasValue ? rows.Value : int.MaxValue;
386+
387+
var selectType = selectExpression.StartsWithIgnoreCase("SELECT DISTINCT") ? "SELECT DISTINCT" : "SELECT";
388+
389+
//Temporary hack till we come up with a more robust paging sln for SqlServer
390+
if (skip == 0)
391+
{
392+
var sql = sb + orderByExpression;
393+
394+
if (take == int.MaxValue)
395+
return sql;
396+
397+
if (sql.Length < "SELECT".Length) return sql;
398+
sql = selectType + " TOP " + take + sql.Substring(selectType.Length, sql.Length - selectType.Length);
399+
return sql;
400+
}
401+
402+
// Required because ordering is done by Windowing function
403+
if (string.IsNullOrEmpty(orderByExpression))
404+
{
405+
if (modelDef.PrimaryKey == null)
406+
throw new ApplicationException("Malformed model, no PrimaryKey defined");
407+
408+
orderByExpression = string.Format("ORDER BY {0}",
409+
OrmLiteConfig.DialectProvider.GetQuotedColumnName(modelDef.PrimaryKey.FieldName));
410+
}
411+
412+
var ret = string.Format(
413+
"SELECT * FROM (SELECT ROW_NUMBER() OVER ({1}) As RowNum, {0} {2}) AS RowConstrainedResult WHERE RowNum > {3} AND RowNum <= {4}",
414+
selectExpression.Substring(selectType.Length),
415+
orderByExpression,
416+
bodyExpression,
417+
skip,
418+
take == int.MaxValue ? take : skip + take);
419+
420+
return ret;
421+
}
364422
}
365423
}

0 commit comments

Comments
 (0)