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

Commit d19d7a7

Browse files
author
James Crowley
committed
Fixed SQL Server support for LIMIT and DISTINCT
Resolved bad SQL generated when using LIMIT and DISTINCT in combination by SQL Server. This method is already hacky as anything... suggestions welcome!
1 parent e2b3367 commit d19d7a7

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

src/ServiceStack.OrmLite.SqlServer/SqlServerExpressionVisitor.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ public override string ToSelectStatement()
2626

2727
sql = base.ToSelectStatement();
2828
if (sql == null || sql.Length < "SELECT".Length) return sql;
29-
sql = "SELECT TOP " + take + " " + sql.Substring("SELECT".Length, sql.Length - "SELECT".Length);
29+
bool hasDistinctInBaseQuery = sql.StartsWithIgnoreCase("SELECT DISTINCT");
30+
string stringToRemoveFromBaseQuery = hasDistinctInBaseQuery ? "SELECT DISTINCT" : "SELECT";
31+
sql = stringToRemoveFromBaseQuery + " TOP " + take + " " + sql.Substring(stringToRemoveFromBaseQuery.Length, sql.Length - stringToRemoveFromBaseQuery.Length);
3032
return sql;
3133
}
3234

src/ServiceStack.OrmLite.SqlServerTests/Expressions/AuthorUseCase.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,19 @@ public void AuthorUsesCases()
224224
Assert.AreEqual("Rodger Contreras".ToUpper(), author.Name);
225225

226226
// select distinct..
227-
ev.Limit().OrderBy(); // clear limit, clear order for postres
227+
ev.Limit().OrderBy(); // clear limit, clear orde
228228
ev.SelectDistinct(r => r.City);
229229
expected = 6;
230230
result = db.Select(ev);
231231
Assert.AreEqual(expected, result.Count);
232232

233+
// select distinct with limit
234+
ev.Limit(0, 4);
235+
ev.SelectDistinct(r => r.City);
236+
expected = 4;
237+
result = db.Select(ev);
238+
Assert.AreEqual(expected, result.Count);
239+
233240
ev.Select(r => Sql.As(Sql.Max(r.Birthday), "Birthday"));
234241
result = db.Select(ev);
235242
var expectedResult = authors.Max(r => r.Birthday);

0 commit comments

Comments
 (0)