构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序

首先修复程序中的一个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);

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

你可能感兴趣的:(asp.net)