zoukankan      html  css  js  c++  java
  • ASP.NET MVC5+EF6+EasyUI 后台管理系统(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);

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

  • 相关阅读:
    【Nginx】ngx_event_core_module模块
    ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
    nyist oj 214 单调递增子序列(二) (动态规划经典)
    java 入门书籍(java7)
    ARCGIS将WGS84坐标投影到高斯平面
    【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
    【springboot】【socket】spring boot整合socket,实现服务器端两种消息推送
    【linux】linux修改open file 大小
    【docker】docker限制日志文件大小的方法+查看日志文件的方法
    【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
  • 原文地址:https://www.cnblogs.com/ymnets/p/3446221.html
Copyright © 2011-2022 走看看