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

简介: 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为sort这个名称填写错误,会导致后台一直无法获取datagrid的排序字段 本来是没有这一讲的,为了使20行的代码精简成2行,我查阅了一些资料,借鉴了一些大神的建议,首先感谢第八讲中,11楼@nyth和15楼@红颜醉丶帝的建议投递,每一次的的排序要都一个判断这的确很麻烦,我们利用反射来解决这个问题。

原文:构建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);

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

目录
相关文章
|
5月前
easyUI datagarid 编辑状态下的combobox动态赋值
easyUI datagarid 编辑状态下的combobox动态赋值
|
5月前
easyUI 动态参数名称和动态参数值
easyUI 动态参数名称和动态参数值
|
JSON JavaScript Java
EasyUI之生成动态异步菜单栏
在项目开发中,对于整体的页面布局中对于菜单导航栏我们一般设计为根据不同的用户权限展示不同的菜单选项,同时菜单显示也会做异步加载处理。本文就来介绍下基于EasyUI的tree插件来实现导航栏的异步加载实现。
EasyUI之生成动态异步菜单栏
EasyUI+JavaWeb奖助学金管理系统[7]-EasyUI经典后台管理系统布局实现
本文目录 1. 本章任务 2. 引入EasyUI 3. 顶部标题栏 4. 左侧导航栏 5. 右侧内容栏 6. 底部版权栏 7. 效果
144 0
EasyUI+JavaWeb奖助学金管理系统[7]-EasyUI经典后台管理系统布局实现
easyui dialog 按钮动态命名
1.方法一: /** * grid新增 * 弹框并且获取支付类型 */ function gridAdd() { var dlg = $('#mydialog').dialog({ title : "缴纳保证金", buttons : [ { ...
940 0
easyui datagrid 表格动态隐藏部分列的展示
1.一套代码中,可能不同的项目情况都在用,但是可能不同的项目要求展示的datagrid列的内容并不一致,所以能够动态的显示部分datagrid列的内容。    即datagrid的中的某一列,这个项目要求显示那个项目要求不显示。
1669 0

相关实验场景

更多