您的位置:首页 > 其它

使用Entity Framework时,如何构建动态排序条件

2011-04-25 14:52 399 查看
/// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="query"></param>
        /// <param name="start"></param>
        /// <param name="limit"></param>
        /// <param name="sort">排序字段</param>
        /// <param name="dir">ASC/DESC</param>
        /// <param name="count">总纪录数</param>
        /// <returns></returns>
        public List<T> PageList(IQueryable<T> query, int start, int limit, string sort, string dir, out int count)
        {
            if (string.IsNullOrEmpty(sort))
                throw new Exception("使用此方法,必须指定排序字段!");

            ParameterExpression param = Expression.Parameter(typeof(T), "it");
            Expression body = param;

            if (Nullable.GetUnderlyingType(body.Type) != null)
                body = Expression.Property(body, "Value");

            PropertyInfo sortProperty = typeof(T).GetProperty(sort, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
            if (sortProperty == null)
                throw new Exception("对像上不存在" + sortProperty + "的字段");

            body = Expression.MakeMemberAccess(body, sortProperty);
            LambdaExpression keySelectorLambda = Expression.Lambda(body, param);
            string queryMethod = dir == "DESC" ? "OrderByDescending" : "OrderBy";
            query = query.Provider.CreateQuery<T>(Expression.Call(typeof(Queryable), queryMethod,
                                                               new Type[] { typeof(T), body.Type },
                                                               query.Expression,
                                                               Expression.Quote(keySelectorLambda)));

            count = query.Count();
            if (start >= 0 && limit > 0) query = query.Skip(start).Take(limit);
            return query.ToList();
        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: