ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序

来源:互联网 发布:高中化学软件下载 编辑:程序博客网 时间:2024/06/05 15:34
系列目录

首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为sort这个名称填写错误,会导致后台一直无法获取datagrid的排序字段

本来是没有这一讲的,为了使20行的代码精简成2行,我查阅了一些资料,借鉴了一些大神的建议,首先感谢第八讲中,11楼@nyth和15楼@红颜醉丶帝的建议投递,每一次的的排序要都一个判断这的确很麻烦,我们利用反射来解决这个问题。

先看原来的代码

 //排序            if (pager.order == "desc")            {                switch (pager.order)                {                    case "CreateTime":                        queryData = queryData.OrderByDescending(c => c.CreateTime);                        break;                    case "Name":                        queryData = queryData.OrderByDescending(c => c.Name);                        break;                    default:                        queryData = queryData.OrderByDescending(c => c.CreateTime);                        break;                }            }            else            {                switch (pager.order)                {                    case "CreateTime":                        queryData = queryData.OrderBy(c => c.CreateTime);                        break;                    case "Name":                        queryData = queryData.OrderBy(c => c.Name);                        break;                    default:                        queryData = queryData.OrderBy(c => c.CreateTime);                        break;                }            }

以上每一次排序都要进行判断,利用反射可以解决这个问题,我把他封装起来了。(需要对反射有一些理解)

在App.Common中新建LinqHelper类代码如下(下面有3个方法,我都对方法进行了注释,看下就明白)

using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace App.Common{   public class LinqHelper    {       /// <summary>       /// 排序       /// </summary>       /// <typeparam name="T"></typeparam>       /// <param name="source"></param>       /// <param name="sortExpression"></param>       /// <param name="sortDirection"></param>       /// <returns></returns>        public static IQueryable<T> DataSorting<T>(IQueryable<T> source, string sortExpression, string sortDirection)        {            string sortingDir = string.Empty;            if (sortDirection.ToUpper().Trim() == "ASC")                sortingDir = "OrderBy";            else if (sortDirection.ToUpper().Trim() == "DESC")                sortingDir = "OrderByDescending";            ParameterExpression param = Expression.Parameter(typeof(T), sortExpression);            PropertyInfo pi = typeof(T).GetProperty(sortExpression);            Type[] types = new Type[2];            types[0] = typeof(T);            types[1] = pi.PropertyType;            Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, source.Expression, Expression.Lambda(Expression.Property(param, sortExpression), param));            IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);            return query;        }       /// <summary>       /// 分页       /// </summary>       /// <typeparam name="T"></typeparam>       /// <param name="source"></param>       /// <param name="pageNumber"></param>       /// <param name="pageSize"></param>       /// <returns></returns>        public static IQueryable<T> DataPaging<T>(IQueryable<T> source, int pageNumber, int pageSize)        {            if (pageNumber <= 1)            {                return source.Take(pageSize);            }            else            {                return source.Skip((pageNumber - 1) * pageSize).Take(pageSize);            }        }       /// <summary>        /// 排序并分页        /// </summary>       /// <typeparam name="T"></typeparam>       /// <param name="source"></param>       /// <param name="sortExpression"></param>       /// <param name="sortDirection"></param>       /// <param name="pageNumber"></param>       /// <param name="pageSize"></param>       /// <returns></returns>        public static IQueryable<T> SortingAndPaging<T>(IQueryable<T> source, string sortExpression, string sortDirection, int pageNumber, int pageSize)        {            IQueryable<T> query = DataSorting<T>(source, sortExpression, sortDirection);            return DataPaging(query, pageNumber, pageSize);        }    }}
View Code

 

我们对Sorting的代码分析如下:

ParameterExpression param = Expression.Parameter(typeof(T), sortExpression);

我们们传入的类型中找出我们需要进行排序的字段。
PropertyInfo pi = typeof(T).GetProperty(sortExpression);

取出要排序字段的相关属性

  Type[] types = new Type[2];
  types[0] = typeof(T); 获得要进行排序的数据集的类型。
  types[1] = pi.PropertyType;  取出我们把什么类型的字段进行排序(即传入参数的值类型)

  Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, source.Expression, Expression.Lambda(Expression.Property(param, sortExpression), param));

生成排序表达式
  IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);

执行排序

现在我们修改一下SysSample的BLL层

将以上的代码修改为

queryData = LinqHelper.DataSorting(queryData,pager.sort,pager.order);

我们的代码顿时精简成了一行,赞一个吧。

阅读全文
0 0
原创粉丝点击