构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)2014-08-10LinQ动态排序首先修复程序中的一个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);}}}