Reputation: 1434
i have string that contain column name for sorting with linq, it work fine when string contain just one column,but when contain with multiple column i don't knwon how can i create linq statement for sorting them.
my string like this : "ClassNo ASC, count DESC, floor ASC" i try sorting like below if one column:
switch (sort.Trim())
{
default:
result = result.OrderBy(u => u.ClassId);
break;
case "ClassNo DESC":
result = result.OrderByDescending(u => u.ClassNo);
break;
case "ClassNo ASC":
result = result.OrderBy(u => u.ClassNo);
break;
case "count DESC":
result = result.OrderByDescending(u => u.count);
break;
case "count ASC":
result = result.OrderBy(u => u.count);
break;
case "floor DESC":
result = result.OrderByDescending(u => u.floor);
break;
case "floor ASC":
result = result.OrderBy(u => u.floor);
break;
case "ClassId DESC":
result = result.OrderByDescending(u => u.ClassId);
break;
}
Upvotes: 1
Views: 1765
Reputation: 18155
You can do something like this:
var ordered1 = result.OrderBy(x => x.count);
var ordered2 = ordered1.ThenBy(x => x.floor);
var ordered3 = ordered2.ThenByDescending(x => x.ClassId);
The thing to note here is that OrderBy()
or OrderByDescending()
returns an IOrderedEnumerable<T>
, which you can then add another level of ordering to.
So in your case, it would be something like this:
// convert to an IOrderedEnumerable<T>
var orderedResult = result.OrderBy(x => 1);
foreach (string part in sort.Split(','))
{
switch (part.Trim())
{
case "ClassNo DESC":
orderedResult = orderedResult.ThenByDescending(u => u.ClassNo);
break;
case "ClassNo ASC":
orderedResult = orderedResult.ThenBy(u => u.ClassNo);
break;
case "count DESC":
orderedResult = orderedResult.ThenByDescending(u => u.count);
break;
case "count ASC":
orderedResult = orderedResult.ThenBy(u => u.count);
break;
case "floor DESC":
orderedResult = orderedResult.ThenByDescending(u => u.floor);
break;
case "floor ASC":
orderedResult = orderedResult.ThenBy(u => u.floor);
break;
case "ClassId DESC":
orderedResult = orderedResult.ThenByDescending(u => u.ClassId);
break;
default:
orderedResult = orderedResult.ThenBy(u => u.ClassId);
break;
}
}
Upvotes: 1