Nimit Joshi
Nimit Joshi

Reputation: 1046

Apply multiple order by in linq

I am trying to sort my list by applying two order by. I just want to sort my list by the following orders:

Order 1: DateTime Descending Order

Order 2: Level Ascending Order

Following is my code:

First Method:

var FinalQuery = (from s in data
  join p in context.A on s.Id equals p.PId                                         
  join PR in context.P on s.RP equals PR.PId

  where PR.PId == s.PId                                            
    && PR.IsActive == true
  select new List
  {
      //columns 
  });

Model.TotalRecord = FinalQuery.Count();
if (Model.IsExportData == false)
{
    Model.ListItems = FinalQuery
        .Skip(Filter.PageNumber == 0 ? 0 : Model.RecordPerPage * (Filter.PageNumber - 1))
        .Take(Model.RecordPerPage).ToList();

    Model.ListItems.OrderByDescending(x => x.LoggedDateTime.Value.Date).ThenBy(x => x.Level);
}
else
{
    Model.ListItems = FinalQuery.ToList();
}

Second Method:

var FinalQuery = (from s in data
  join p in context.A on s.Id equals p.PId                                         
  join PR in context.P on s.RP equals PR.PId


  where PR.PId == s.PId                                            
    && PR.IsActive == true
  select new List
  {
      //columns 
  });

Model.TotalRecord = FinalQuery.Count();
if (Model.IsExportData == false)
{
    Model.ListItems = FinalQuery
        .OrderByDescending(x => x.LoggedDateTime.Value.Date)
        .ThenBy(x => x.Level)
        .Skip(Filter.PageNumber == 0 ? 0 : Model.RecordPerPage * (Filter.PageNumber - 1))
        .Take(Model.RecordPerPage).ToList();
}
else
{
    Model.ListItems = FinalQuery.ToList();
}

I am not getting the actual result.

Upvotes: 0

Views: 703

Answers (1)

Martin Backasch
Martin Backasch

Reputation: 1899

You don't assign the result of your OrderBy Linq-Chain in your first method.

Instead of

Model.ListItems.OrderByDescending(x => x.LoggedDateTime.Value.Date)
               .ThenBy(x => x.Level);

you have to assign it to something like

var result = Model.ListItems.OrderByDescending(x => x.LoggedDateTime.Value.Date)
                            .ThenBy(x => x.Level);

As you can see from the sources:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    return new OrderedEnumerable<TSource, TKey>(source, keySelector, null, false);
}

The OrderBy returns a new OrderedEnumerable, where the Sort()-Method of a list works on the list itself.

System.Collections.Generic.List.Sort

public void Sort()
{
    Sort(0, Count, null);
}

Upvotes: 2

Related Questions