Selecting OrderBy or OrderByDescending using a delegate

Linq to SQL has two methods to sort a query ascending or descending, respectively:

  • OrderBy()
  • OrderByDescending()

Sometimes, you want to have a SortDirection determining the sort order. You can do this by using a delegate:

public delegate IOrderedEnumerable<TSource> OrderFunc<TSource, TKey>(Func<TSource, TKey> keySelector);

...

OrderFunc<Car, string> orderFunc;

if (sortDirection == SortDirection.Ascending)
    orderFunc = matches.OrderBy;
else
    orderFunc = matches.OrderByDescending;

result = orderFunc(c => c.Wheels);

OrderFunc is the type of a variable, just like int or string. The variable orderFunc is of type OrderFunc. Instead of holding a value, it holds a reference to a method. In our case, that method is either OrderBy or OrderByDescending.