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

Commit 4122679

Browse files
committed
Add support for OrderByRandon() to all RDBMS providers
1 parent c8d8fbc commit 4122679

File tree

7 files changed

+60
-1
lines changed

7 files changed

+60
-1
lines changed

src/ServiceStack.OrmLite.Oracle/OracleSqlExpression.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ protected override void ConvertToPlaceholderAndParameter(ref object right)
4242

4343
right = parameter.ParameterName;
4444
}
45+
46+
public override SqlExpression<T> OrderByRandom()
47+
{
48+
return base.OrderBy("dbms_random.value");
49+
}
4550
}
4651
}
4752

src/ServiceStack.OrmLite.PostgreSQL/PostgreSqlExpression.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,10 @@ protected override string GetQuotedColumnName(ModelDefinition tableDef, string m
2121
}
2222
return memberName;
2323
}
24+
25+
public override SqlExpression<T> OrderByRandom()
26+
{
27+
return base.OrderBy("RANDOM()");
28+
}
2429
}
2530
}

src/ServiceStack.OrmLite.SqlServer/SqlServerExpression.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,10 @@ public override string GetSubstringSql(object quotedColumn, int startIndex, int?
4949
? string.Format("substring({0}, {1}, {2})", quotedColumn, startIndex, length.Value)
5050
: string.Format("substring({0}, {1}, LEN({0}) - {1} + 1)", quotedColumn, startIndex );
5151
}
52-
}
52+
53+
public override SqlExpression<T> OrderByRandom()
54+
{
55+
return base.OrderBy("NEWID()");
56+
}
57+
}
5358
}

src/ServiceStack.OrmLite.Sqlite/SqliteExpression.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,10 @@ protected override object VisitSqlMethodCall(MethodCallExpression m)
7474

7575
return new PartialSqlString(statement);
7676
}
77+
78+
public override SqlExpression<T> OrderByRandom()
79+
{
80+
return base.OrderBy("random()");
81+
}
7782
}
7883
}

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,11 @@ public virtual SqlExpression<T> OrderBy(string orderBy)
356356
return this;
357357
}
358358

359+
public virtual SqlExpression<T> OrderByRandom()
360+
{
361+
return OrderBy("RAND()");
362+
}
363+
359364
public ModelDefinition GetModelDefinition(FieldDefinition fieldDef)
360365
{
361366
if (modelDef.FieldDefinitions.Any(x => x == fieldDef))
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System.Linq;
2+
using NUnit.Framework;
3+
using ServiceStack.Common.Tests.Models;
4+
using ServiceStack.OrmLite.Tests.Expression;
5+
using ServiceStack.Text;
6+
7+
namespace ServiceStack.OrmLite.Tests
8+
{
9+
[TestFixture]
10+
public class OrderByTests : OrmLiteTestBase
11+
{
12+
[Test]
13+
public void Can_order_by_random()
14+
{
15+
using (var db = OpenDbConnection())
16+
{
17+
db.DropAndCreateTable<LetterFrequency>();
18+
19+
10.Times(i => db.Insert(new LetterFrequency { Letter = ('A' + i).ToString() }));
20+
21+
var rowIds1 = db.Select<LetterFrequency>(q => q.OrderBy(x => x.Id)).Map(x => x.Id);
22+
var rowIds2 = db.Select<LetterFrequency>(q => q.OrderBy(x => x.Id)).Map(x => x.Id);
23+
24+
Assert.That(rowIds1.SequenceEqual(rowIds2));
25+
26+
rowIds1 = db.Select<LetterFrequency>(q => q.OrderByRandom()).Map(x => x.Id);
27+
rowIds2 = db.Select<LetterFrequency>(q => q.OrderByRandom()).Map(x => x.Id);
28+
29+
Assert.That(!rowIds1.SequenceEqual(rowIds2));
30+
}
31+
}
32+
}
33+
}

tests/ServiceStack.OrmLite.Tests/ServiceStack.OrmLite.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@
161161
<Compile Include="LoggingTests.cs" />
162162
<Compile Include="MergeTests.cs" />
163163
<Compile Include="MockAllApiTests.cs" />
164+
<Compile Include="OrderByTests.cs" />
164165
<Compile Include="OrmLiteContextTests.cs" />
165166
<Compile Include="OrmLiteExecFilterTests.cs" />
166167
<Compile Include="OrmLiteFiltersTests.cs" />

0 commit comments

Comments
 (0)