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);

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

  • 相关阅读:
    springmvc最简单的搭建,初学者必看
    搭建服务器需要的那些
    jaxb使用
    Memcached Java Client API详解
    memcached client --ref
    使用Dom4j解析XML
    架构整洁之道
    架构的整理
    VMware虚拟机的三种联网方法及原理
    软件开发进度管理
  • 原文地址:https://www.cnblogs.com/ymnets/p/3446221.html
Copyright © 2011-2022 走看看