Skip to content

Commit 192ec89

Browse files
Fixed issue with multiple column sorting (#77)
Added ThenBy and ThenByDescending to the ordering when there are multple columns being ordered.
1 parent 47d4430 commit 192ec89

File tree

2 files changed

+57
-16
lines changed

2 files changed

+57
-16
lines changed

DatatableJS.Data.UnitTest/DataTests.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ public void Setup()
1515
{
1616
_list = new List<Person>
1717
{
18-
new Person { Name = "Jon" },
19-
new Person { Name = "Arya" }
18+
new Person { Name = "Jon", Age = 1},
19+
new Person { Name = "Arya", Age = 1 },
20+
new Person { Name = "Arya", Age = 2 }
2021
}.AsQueryable();
2122

2223
var _columns = new List<Column> {
23-
new Column {data = "Name", name = "Name", orderable = true, searchable = true, search = new Search()}
24+
new Column {data = "Name", name = "Name", orderable = true, searchable = true, search = new Search()},
25+
new Column {data = "Age", name = "Age", orderable = true, searchable = true, search = new Search()},
2426
};
2527

2628
_request = new DataRequest { columns = _columns, draw = 1, length = 10 };
@@ -34,10 +36,32 @@ public void ToDataResult_WhenFilterWithNameDoesNotContain_ReturnsListCountZero()
3436

3537
Assert.That(result.data.Count, Is.EqualTo(1));
3638
}
39+
40+
[Test]
41+
public void ToDataResult_WhenSortingByNameAndAge()
42+
{
43+
_request.order.Add(new Order
44+
{
45+
column = 0,
46+
dir = "asc"
47+
});
48+
_request.order.Add(new Order
49+
{
50+
column = 1,
51+
dir = "asc"
52+
});
53+
var result = _list.ToDataResult(_request);
54+
55+
Assert.That(result.data[0].Name, Is.EqualTo("Arya"));
56+
Assert.That(result.data[0].Age, Is.EqualTo(1));
57+
Assert.That(result.data[1].Name, Is.EqualTo("Arya"));
58+
Assert.That(result.data[1].Age, Is.EqualTo(2));
59+
}
3760
}
3861

3962
public class Person
4063
{
4164
public string Name { get; set; }
65+
public int Age { get; set; }
4266
}
4367
}

DatatableJS.Data/DatatableExtensions.cs

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,15 @@ public static DataResult<T> ToDataResult<T>(this IQueryable<T> query, DataReques
7575
}
7676
else
7777
{
78-
foreach (var item in request.order)
78+
query = request.order[0].dir != "asc"
79+
? (IQueryable<T>)query.OrderByDescending<T>(request.columns[request.order[0].column].data)
80+
: (IQueryable<T>)query.OrderBy<T>(request.columns[request.order[0].column].data);
81+
82+
for (var i = 1; i < request.order.Count(); i++)
7983
{
80-
if (item.dir == "asc")
81-
{
82-
query = query.OrderBy(request.columns[item.column].data);
83-
}
84-
else
85-
{
86-
query = query.OrderByDescending(request.columns[item.column].data);
87-
}
84+
query = request.order[i].dir != "asc"
85+
? (IQueryable<T>)query.ThenByDescending<T>(request.columns[request.order[i].column].data)
86+
: (IQueryable<T>)query.ThenBy<T>(request.columns[request.order[i].column].data);
8887
}
8988
}
9089

@@ -109,14 +108,32 @@ private static Expression<Func<T, bool>> GetExpression<T>(Operand operand, strin
109108
});
110109
}
111110

112-
private static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string memberName)
111+
private static IOrderedQueryable<T> OrderBy<T>(
112+
this IQueryable<T> query,
113+
string memberName)
114+
{
115+
return query.OrderByCreate<T>(memberName, nameof(OrderBy));
116+
}
117+
118+
private static IOrderedQueryable<T> ThenBy<T>(
119+
this IQueryable<T> query,
120+
string memberName)
121+
{
122+
return query.OrderByCreate<T>(memberName, nameof(ThenBy));
123+
}
124+
125+
private static IOrderedQueryable<T> OrderByDescending<T>(
126+
this IQueryable<T> query,
127+
string memberName)
113128
{
114-
return OrderByCreate(query, memberName, "OrderBy");
129+
return query.OrderByCreate<T>(memberName, nameof(OrderByDescending));
115130
}
116131

117-
private static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string memberName)
132+
private static IOrderedQueryable<T> ThenByDescending<T>(
133+
this IQueryable<T> query,
134+
string memberName)
118135
{
119-
return OrderByCreate(query, memberName, "OrderByDescending");
136+
return query.OrderByCreate<T>(memberName, nameof(ThenByDescending));
120137
}
121138

122139
private static IOrderedQueryable<T> OrderByCreate<T>(this IQueryable<T> query, string memberName, string direction)

0 commit comments

Comments
 (0)