コード例 #1
0
        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));
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
ファイル: PagedList.cs プロジェクト: HuweiKop/Demo
        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));
        }