public static IQueryable <T> OrderBy <T>(this IQueryable <T> source, string sortProperty, ListSortDirection sortOrder) { var type = typeof(T); var property = type.GetProperty(sortProperty); var parameter = Expression.Parameter(type, "p"); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); var typeArguments = new[] { type, property.PropertyType }; var methodName = sortOrder == ListSortDirection.Ascending ? "OrderBy" : "OrderByDescending"; var resultExp = Expression.Call(typeof(Queryable), methodName, typeArguments, source.Expression, Expression.Quote(orderByExp)); return(source.Provider.CreateQuery <T>(resultExp)); }
/// <summary> /// 动态组合多排序字段 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="query"></param> /// <param name="orderByExpression"></param> /// <returns></returns> public static IQueryable <T> ExpressionOrderBy <T>(this IQueryable <T> query, params Qian.Models.OrderModelField[] orderByExpression) { var parameter = Expression.Parameter(typeof(T), "o"); if (orderByExpression != null && orderByExpression.Length > 0) { for (int i = 0; i < orderByExpression.Length; i++) { //根据属性名获取属性 var property = typeof(T).GetProperty(orderByExpression[i].propertyName); //创建一个访问属性的表达式 var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); string OrderName = orderByExpression[i].isAsc ? "OrderBy" : "OrderByDescending"; if (i > 0) { OrderName = orderByExpression[i].isAsc ? "ThenBy" : "ThenByDescending"; } else { OrderName = orderByExpression[i].isAsc ? "OrderBy" : "OrderByDescending"; } MethodCallExpression resultExp = Expression.Call(typeof(Queryable), OrderName, new Type[] { typeof(T), property.PropertyType }, query.Expression, Expression.Quote(orderByExp)); query = query.Provider.CreateQuery <T>(resultExp); } } return(query); }
public static IQueryable <TEntity> OrderBy <TEntity>(this IQueryable <TEntity> source, string orderByProperty, string orderAs) where TEntity : class { if (string.IsNullOrWhiteSpace(orderByProperty)) { orderByProperty = "Id"; } string command = "desc".Equals(orderAs) ? "OrderByDescending" : "OrderBy"; var type = typeof(TEntity); var property = type.GetProperty(orderByProperty); var parameter = Expression.Parameter(type, "p"); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExpression = Expression.Lambda(propertyAccess, parameter); var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression)); return(source.Provider.CreateQuery <TEntity>(resultExpression)); }