habiat
habiat

Reputation: 1434

multiple orderby column of string by linq

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

Answers (1)

dana
dana

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

Related Questions