public static IQueryable <T> OrderBy <T>(this IQueryable <T> queryable, OrderQuery order) where T : class { Type type = typeof(T); if (order != null) { var orderParams = order.GetOrderParams(); if (orderParams != null && orderParams.Length > 0) { int i = 0; foreach (var orderExpr in orderParams) { PropertyInfo property = type.GetProperty(orderExpr.PropertyName); if (property == null) { throw new ArgumentException("propertyName", "Not Exist"); } ParameterExpression param = Expression.Parameter(type, "p"); Expression propertyAccessExpression = Expression.MakeMemberAccess(param, property); LambdaExpression orderByExpression = Expression.Lambda(propertyAccessExpression, param); string methodName = orderExpr.OrderType == OrderType.ASC ? (i == 0 ? "OrderBy" : "ThenBy") : (i == 0 ? "OrderByDescending" : "ThenByDescending"); MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { type, property.PropertyType }, queryable.Expression, Expression.Quote(orderByExpression)); queryable = queryable.Provider.CreateQuery <T>(resultExp); i++; } } } return(queryable); }