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

Commit e0c8c4f

Browse files
committed
Add support for OrderBy a joined table
1 parent f89b543 commit e0c8c4f

File tree

2 files changed

+77
-4
lines changed

2 files changed

+77
-4
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,17 @@ public virtual SqlExpression<T> OrderByFieldsDescending(params string[] fieldNam
361361
return OrderByFields(" DESC", fieldNames);
362362
}
363363

364-
public virtual SqlExpression<T> OrderBy<TKey>(Expression<Func<T, TKey>> keySelector)
364+
public virtual SqlExpression<T> OrderBy(Expression<Func<T, object>> keySelector)
365+
{
366+
return OrderByInternal(keySelector);
367+
}
368+
369+
public virtual SqlExpression<T> OrderBy<Table>(Expression<Func<Table, object>> keySelector)
370+
{
371+
return OrderByInternal(keySelector);
372+
}
373+
374+
private SqlExpression<T> OrderByInternal(Expression keySelector)
365375
{
366376
sep = string.Empty;
367377
useFieldName = true;
@@ -380,7 +390,17 @@ public virtual SqlExpression<T> ThenBy(string orderBy)
380390
return this;
381391
}
382392

383-
public virtual SqlExpression<T> ThenBy<TKey>(Expression<Func<T, TKey>> keySelector)
393+
public virtual SqlExpression<T> ThenBy(Expression<Func<T, object>> keySelector)
394+
{
395+
return ThenByInternal(keySelector);
396+
}
397+
398+
public virtual SqlExpression<T> ThenBy<Table>(Expression<Func<Table, object>> keySelector)
399+
{
400+
return ThenByInternal(keySelector);
401+
}
402+
403+
private SqlExpression<T> ThenByInternal(Expression keySelector)
384404
{
385405
sep = string.Empty;
386406
useFieldName = true;
@@ -390,7 +410,17 @@ public virtual SqlExpression<T> ThenBy<TKey>(Expression<Func<T, TKey>> keySelect
390410
return this;
391411
}
392412

393-
public virtual SqlExpression<T> OrderByDescending<TKey>(Expression<Func<T, TKey>> keySelector)
413+
public virtual SqlExpression<T> OrderByDescending(Expression<Func<T, object>> keySelector)
414+
{
415+
return OrderByDescendingInternal(keySelector);
416+
}
417+
418+
public virtual SqlExpression<T> OrderByDescending<Table>(Expression<Func<Table, object>> keySelector)
419+
{
420+
return OrderByDescendingInternal(keySelector);
421+
}
422+
423+
private SqlExpression<T> OrderByDescendingInternal(Expression keySelector)
394424
{
395425
sep = string.Empty;
396426
useFieldName = true;
@@ -409,7 +439,17 @@ public virtual SqlExpression<T> ThenByDescending(string orderBy)
409439
return this;
410440
}
411441

412-
public virtual SqlExpression<T> ThenByDescending<TKey>(Expression<Func<T, TKey>> keySelector)
442+
public virtual SqlExpression<T> ThenByDescending(Expression<Func<T, object>> keySelector)
443+
{
444+
return ThenByDescendingInternal(keySelector);
445+
}
446+
447+
public virtual SqlExpression<T> ThenByDescending<Table>(Expression<Func<Table, object>> keySelector)
448+
{
449+
return ThenByDescendingInternal(keySelector);
450+
}
451+
452+
private SqlExpression<T> ThenByDescendingInternal(Expression keySelector)
413453
{
414454
sep = string.Empty;
415455
useFieldName = true;

tests/ServiceStack.OrmLite.Tests/Expression/SqlExpressionTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ public class TableB
356356
{
357357
public int Id { get; set; }
358358
public int TableAId { get; set; }
359+
public string Name { get; set; }
359360
}
360361

361362
[Test]
@@ -394,5 +395,37 @@ public void Can_query_bools()
394395
Assert.That(result.Id, Is.EqualTo(1));
395396
}
396397
}
398+
399+
[Test]
400+
public void Can_order_by_Joined_table()
401+
{
402+
using (var db = OpenDbConnection())
403+
{
404+
db.DropAndCreateTable<TableA>();
405+
db.DropAndCreateTable<TableB>();
406+
407+
db.Insert(new TableA { Id = 1, Bool = false });
408+
db.Insert(new TableA { Id = 2, Bool = true });
409+
db.Insert(new TableB { Id = 1, TableAId = 1, Name = "Z" });
410+
db.Insert(new TableB { Id = 2, TableAId = 2, Name = "A" });
411+
412+
var q = db.From<TableA>()
413+
.Join<TableB>()
414+
.OrderBy(x => x.Id);
415+
416+
var rows = db.Select(q);
417+
db.GetLastSql().Print();
418+
Assert.That(rows.Map(x => x.Id), Is.EqualTo(new[] {1, 2}));
419+
420+
421+
q = db.From<TableA>()
422+
.Join<TableB>()
423+
.OrderBy<TableB>(x => x.Name);
424+
425+
rows = db.Select(q);
426+
db.GetLastSql().Print();
427+
Assert.That(rows.Map(x => x.Id), Is.EqualTo(new[] { 2, 1 }));
428+
}
429+
}
397430
}
398431
}

0 commit comments

Comments
 (0)