Site Loader
Auckland, New Zealand
In this post we are going to discuss Ordering in LINQ. Most of the time while manipulating data, we end up in situation where we need to order data, it can be either Ascending order or Descending order. In LINQ we can do this very easily using extension methods such as OrderBy() and OrderByDescending(). Let’s see how they actually work with an example We will take the same example which we are working for past couple of post in LINQ Here is our custom class (students)
    public class Student
    {
        public int StudID { get; set; }
        public string Name { get; set; }
        public string Class { get; set; }
        public List Subjects { get; set; }
    }
Let’s create some students
//Create some students
List students = new List()
{
    new Student { StudID = 101, Name= "Karthik", Class = "10th", Subjects = new List { "C#", "ADO.Net", "EF"}},
    new Student { StudID = 108, Name= "Karthik", Class = "10th", Subjects = new List { "C#", "ADO.Net", "EF"}},
    new Student { StudID = 104, Name = "Ram", Class = "11th", Subjects= new List{ ".Net", "C#", "SQL", "EF"}},
    new Student { StudID = 103, Name = "John", Class = "9th", Subjects= new List{ ".Net", "MVC"}},
    new Student { StudID = 106, Name = "Bill", Class = "9th", Subjects= new List{ "EF", "MVC"}},
};
Now lets start working on the Ordering stuffs

Ascending Order

Let’s order our students by studID with Ascending order
//Order Students by StudID (Ascending by Default)
//QUERY SYNTAX
Console.WriteLine("Order students by StudID (Ascending by Default) -- QUERY SYNTAX");
var OrderByID = from student in students
                orderby student.StudID
                select student;

foreach (var item in OrderByID)
    Console.WriteLine(item.StudID + "\t" + item.Name);

We can do the same with Method Syntax as shown below (Remember there are two types of syntax in LINQ as discussed in first post)
//METHOD SYNTAX
Console.WriteLine("\nOrder students by StudID (Ascending by Default) -- METHOD SYNTAX");
var OrderByIDM = students.OrderBy(x => x.StudID);

foreach (var item in OrderByIDM)
    Console.WriteLine(item.StudID + "\t" + item.Name);
As you can see, LINQ by default has Order By as Ascending.

Output

Descending Order

Let’s order our students by StudID with Descending Order
//Order Students by StudID in Descending order
//QUERY SYNTAX
Console.WriteLine("\nOrder students by StudID Descending -- QUERY SYNTAX");
var OrderByIDDesc = from student in students
                    orderby student.StudID descending
                    select student;

foreach (var item in OrderByIDDesc)
    Console.WriteLine(item.StudID + "\t" + item.Name);
With Method Syntax
//METHOD SYNTAX
Console.WriteLine("\nOrder students by StudID Descending -- METHOD SYNTAX");
var OrderByIDDescM = students.OrderByDescending(x => x.StudID);

foreach (var item in OrderByIDDescM)
    Console.WriteLine(item.StudID + "\t" + item.Name);

Output

As you can see the students are listed in descending order based on their StudID

Order by Ascending and Then order by Descending (Different Properties)

Let’s say we have situation wherein we need to order our student by Name as Ascending, but ID as Desceding which we can achieve with following code snippet
//Order students by Name (Ascending by Default) and then by StudID (Descending)
//QUERY SYNTAX
Console.WriteLine("\nOrder students by Name (Ascending) and then by StudID (Descending) -- QUERY SYNTAX");
var OrderByNameAndID = from student in students
                        orderby student.Name, student.StudID descending
                        select student;

foreach (var item in OrderByNameAndID)
    Console.WriteLine(item.StudID + "\t" + item.Name);
With Method Syntax
//METHOD SYNTAX
Console.WriteLine("\nOrder students by Name (Ascending) and then by StudID (Descending) -- METHOD SYNTAX");
var OrderByNameAndIDM = students.OrderBy(x => x.Name).ThenByDescending(x => x.StudID);

foreach (var item in OrderByNameAndIDM)
    Console.WriteLine(item.StudID + "\t" + item.Name);

Output

Here is the complete code
public static void LINQOrdering()
{

    //Create some students
    List students = new List()
    {
        new Student { StudID = 101, Name= "Karthik", Class = "10th", Subjects = new List { "C#", "ADO.Net", "EF"}},
        new Student { StudID = 108, Name= "Karthik", Class = "10th", Subjects = new List { "C#", "ADO.Net", "EF"}},
        new Student { StudID = 104, Name = "Ram", Class = "11th", Subjects= new List{ ".Net", "C#", "SQL", "EF"}},
        new Student { StudID = 103, Name = "John", Class = "9th", Subjects= new List{ ".Net", "MVC"}},
        new Student { StudID = 106, Name = "Bill", Class = "9th", Subjects= new List{ "EF", "MVC"}},
    };


    //Order Students by StudID (Ascending by Default)
    //QUERY SYNTAX
    Console.WriteLine("Order students by StudID (Ascending by Default) -- QUERY SYNTAX");
    var OrderByID = from student in students
                    orderby student.StudID
                    select student;

    foreach (var item in OrderByID)
        Console.WriteLine(item.StudID + "\t" + item.Name);


    //METHOD SYNTAX
    Console.WriteLine("\nOrder students by StudID (Ascending by Default) -- METHOD SYNTAX");
    var OrderByIDM = students.OrderBy(x => x.StudID);

    foreach (var item in OrderByIDM)
        Console.WriteLine(item.StudID + "\t" + item.Name);

    //Order Students by StudID in Descending order
    //QUERY SYNTAX
    Console.WriteLine("\nOrder students by StudID Descending -- QUERY SYNTAX");
    var OrderByIDDesc = from student in students
                        orderby student.StudID descending
                        select student;

    foreach (var item in OrderByIDDesc)
        Console.WriteLine(item.StudID + "\t" + item.Name);


    //METHOD SYNTAX
    Console.WriteLine("\nOrder students by StudID Descending -- METHOD SYNTAX");
    var OrderByIDDescM = students.OrderByDescending(x => x.StudID);

    foreach (var item in OrderByIDDescM)
        Console.WriteLine(item.StudID + "\t" + item.Name);

    //Order students by Name (Ascending by Default) and then by StudID (Descending)
    //QUERY SYNTAX
    Console.WriteLine("\nOrder students by Name (Ascending) and then by StudID (Descending) -- QUERY SYNTAX");
    var OrderByNameAndID = from student in students
                            orderby student.Name, student.StudID descending
                            select student;

    foreach (var item in OrderByNameAndID)
        Console.WriteLine(item.StudID + "\t" + item.Name);

    //METHOD SYNTAX
    Console.WriteLine("\nOrder students by Name (Ascending) and then by StudID (Descending) -- METHOD SYNTAX");
    var OrderByNameAndIDM = students.OrderBy(x => x.Name).ThenByDescending(x => x.StudID);

    foreach (var item in OrderByNameAndIDM)
        Console.WriteLine(item.StudID + "\t" + item.Name);
    }
}
Here is the output

These are ordering in LINQ and are very helpful while working with complex and large data, as you can see we have not even used a single condition statement or complex looping to perform the ordering operation. Please leave your comments and let me know if I need anything to add. Thanks, Karthik KK

Post Author: Karthik kk

Leave a Reply

Your email address will not be published. Required fields are marked *