public static IOrderedQueryable <T> OrderBy <T>(this IQueryable <T> query, SortableParams parameters) { var type = typeof(T); var param = Expression.Parameter(type, "x"); var pi = GetProperty(type, parameters.OrderByField); var expr = Expression.Property(param, pi); var propertyType = pi.PropertyType; var delegateType = typeof(Func <,>).MakeGenericType(type, propertyType); var lambda = Expression.Lambda(delegateType, expr, param); var method = GetOrderByMethod(parameters.OrderByAscending); return((IOrderedQueryable <T>)method.MakeGenericMethod(type, propertyType) .Invoke(null, new object[] { query, lambda })); }
public static IOrderedQueryable <TEntity> OrderBy <TEntity>(this IQueryable <TEntity> query, SortableParams sortableParams) { var elemType = typeof(TEntity); var parameter = Expression.Parameter(elemType); var prop = elemType.GetProperty(sortableParams.OrderByField); var expPropertryOrField = Expression.Property(parameter, prop.Name); var genType = typeof(Func <,>).MakeGenericType(elemType, prop.PropertyType); var selector = Expression.Lambda(expPropertryOrField, parameter); var orderBy = sortableParams.OrderByDesceding ? "OrderByDescending" : "OrderBy"; var orderByExpression = Expression.Call(typeof(Queryable), orderBy, new[] { elemType, prop.PropertyType }, query.Expression, selector ); return((IOrderedQueryable <TEntity>)query.Provider.CreateQuery <TEntity>(orderByExpression)); }