首页
学习
活动
专区
圈层
工具
发布
30 篇文章
1
ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
2
ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-Web打印
3
ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版
4
ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts
5
ASP.NET MVC5+EF6+EasyUI 后台管理系统(7)-MVC与EasyUI DataGrid
6
ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结
7
ASP.NET MVC5+EF6+EasyUI 后台管理系统(60)-系统总结
8
ASP.NET MVC5+EF6+EasyUI 后台管理系统(80)-自由桌面
9
ASP.NET MVC5+EF6+EasyUI 后台管理系统(91)-EF 连接 MySql
10
ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构
11
ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构
12
ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
13
ASP.NET MVC5+EF6+EasyUI 后台管理系统-关于WebApi的用法
14
ASP.NET MVC5+EF6+EasyUI 后台管理系统(90)-EF 扩展操作
15
ASP.NET MVC5+EF6+EasyUI 后台管理系统(5)-EF增删改查
16
ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
17
ASP.NET MVC5+EF6+EasyUI 后台管理系统(33)-MVC 表单验证
18
ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序
19
ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入
20
ASP.NET MVC5+EF6+EasyUI 后台管理系统(57)-插件---ueditor使用
21
ASP.NET MVC5+EF6+EasyUI 后台管理系统(50)-Easyui 扁平化皮肤
22
ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]
23
ASP.NET MVC5+EF6+EasyUI 后台管理系统(31)-MVC使用RDL报表
24
ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
25
ASP.NET MVC5+EF6+EasyUI 后台管理系统-分配角色给用户
26
ASP.NET MVC5+EF6+EasyUI 后台管理系统--工作流演示截图
27
ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出
28
ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
29
ASP.NET MVC5+EF6+EasyUI 后台管理系统(92)-打印EasyUI 的datagrid表格
30
ASP.NET MVC5+EF6+EasyUI 后台管理系统(87)-MVC Excel导入和导出

ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序

首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为sort这个名称填写错误,会导致后台一直无法获取datagrid的排序字段

本来是没有这一讲的,为了使20行的代码精简成2行,我查阅了一些资料,借鉴了一些大神的建议,首先感谢第八讲中,11楼@nyth和15楼@红颜醉丶帝的建议投递,每一次的的排序要都一个判断这的确很麻烦,我们利用反射来解决这个问题。

先看原来的代码

代码语言:javascript
复制
 //排序
            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个方法,我都对方法进行了注释,看下就明白)

代码语言:javascript
复制
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);
        }
    }
}

我们对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层

将以上的代码修改为

代码语言:javascript
复制
queryData = LinqHelper.DataSorting(queryData,pager.sort,pager.order);

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

下一篇
举报
领券