using System.Linq.Expressions;
public static void Main()
HireDate = new DateTime(2017, 1, 1)
HireDate = new DateTime(2014, 12, 31)
HireDate = new DateTime(2017, 1, 1)
HireDate = new DateTime(2017, 1, 1)
foreach (var emp in employees.AsQueryable().OrderByPropertyOrField("Name")) {
Console.WriteLine("{0} - {1:d}", emp.Name, emp.HireDate);
public string Name { get; set; }
public DateTime HireDate { get; set; }
public static class EnumerableExtensions
public static IQueryable<T> OrderByPropertyOrField<T>(this IQueryable<T> queryable, string propertyOrFieldName, bool ascending = true)
var elementType = typeof (T);
var orderByMethodName = ascending ? "OrderBy" : "OrderByDescending";
var parameterExpression = Expression.Parameter(elementType);
var propertyOrFieldExpression = Expression.PropertyOrField(parameterExpression, propertyOrFieldName);
var selector = Expression.Lambda(propertyOrFieldExpression, parameterExpression);
var orderByExpression = Expression.Call(typeof (Queryable), orderByMethodName,
new[] {elementType, propertyOrFieldExpression.Type}, queryable.Expression, selector);
return queryable.Provider.CreateQuery<T>(orderByExpression);