static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName)
ParameterExpression arg = Expression.Parameter(typeof(T), "x");
foreach (string prop in property.Split('.'))
expr = Expression.PropertyOrField(expr, prop);
Type delegateType = typeof(Func<, >).MakeGenericType(typeof(T), expr.Type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
return (IOrderedQueryable<T>)typeof(Queryable).GetMethods().Single(method => method.Name == methodName && method.IsGenericMethodDefinition && method.GetGenericArguments().Length == 2 && method.GetParameters().Length == 2).MakeGenericMethod(typeof(T), expr.Type).Invoke(null, new object[]{source, lambda});
public static IOrderedQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> query, string propertyName, string sortDirection, bool isContinuation = false)
var entityType = typeof(TSource);
var propertyInfo = entityType.GetProperty(propertyName);
if (propertyInfo.DeclaringType != entityType)
propertyInfo = propertyInfo.DeclaringType.GetProperty(propertyName);
if (propertyInfo == null)
return (IOrderedQueryable<TSource>)query;
var arg = Expression.Parameter(entityType, "x");
var property = Expression.MakeMemberAccess(arg, propertyInfo);
var selector = Expression.Lambda(property, new ParameterExpression[]{arg});
var methodName = sortDirection.ToUpper() == "DESC" ? "OrderByDescending" : "OrderBy";
methodName = sortDirection.ToUpper() == "DESC" ? "ThenByDescending" : "ThenBy";
var method = typeof(Queryable).GetMethods().Where(m => m.Name == methodName && m.IsGenericMethodDefinition).Where(m => m.GetParameters().ToList().Count == 2)
MethodInfo genericMethod = method.MakeGenericMethod(entityType, propertyInfo.PropertyType);
return (IOrderedQueryable<TSource>)genericMethod.Invoke(genericMethod, new object[]{query, selector});