zoukankan      html  css  js  c++  java
  • 构建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);

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

  • 相关阅读:
    Ubuntu配置sublime text 3的c编译环境
    ORA-01078错误举例:SID的大写和小写错误
    linux下多进程的文件拷贝与进程相关的一些基础知识
    ASM(四) 利用Method 组件动态注入方法逻辑
    基于Redis的三种分布式爬虫策略
    Go语言并发编程总结
    POJ2406 Power Strings 【KMP】
    nyoj 会场安排问题
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    Java的String、StringBuffer和StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/zhangjunwei87/p/4680685.html
Copyright © 2011-2022 走看看