Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序

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

作者头像
用户1149182
发布于 2018-01-16 06:33:32
发布于 2018-01-16 06:33:32
84100
代码可运行
举报
运行总次数:0
代码可运行

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

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

先看原来的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //排序
            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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
queryData = LinqHelper.DataSorting(queryData,pager.sort,pager.order);

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-11-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
创建新表单之后,我们就可以起草申请了,申请按照严格的表单步骤和分支执行。 起草的同时,我们分解流转的规则中的审批人并保存,具体流程如下 接下来创建DrafContoller控制器,此控制器只有2个页面,一个Create(起草页面)Index(表单列表) 表单列表显示个人想法,我是根据分类直接获取其下表单,即Flow_Type下的Flow_Form public ActionResult Index() { List<Flow_TypeModel> list = m_
用户1149182
2018/01/16
8910
ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
前言 听标题的名字似乎是一个非常牛X复杂的功能,但是实际上它确实是非常复杂的,我们本节将演示如何实现对数据,进行组合查询(数据筛选) 我们都知道Excel中是如何筛选数据的.就像下面一样 他是一
用户1149182
2018/01/12
2.6K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI Datagrid在加载的时候会提交一些分页的信息到后台,我们需要根据这些信息来进行数据分页再次返回到前台 实现 首先要让DataGrid支持分页,我们需要在JS Datagrid中加入下列几个属性 是否启用分页:pagination 默认是false 每页数量:pageSize 默认10 可选择每页数量:pageList 默认[10,20,30,40,50] 排序字段:sortName 默认null 排序类型:sortO
用户1149182
2018/01/16
1.3K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
ASP.NET MVC5+EF6+EasyUI 后台管理系统(22)-权限管理系统-模块导航制作
最近比较忙,系统难度独步增加,文章的发布速度明显比以前慢了。 由于我们已经跑通了整个系统,所有东西都回到了简单,接下来我们做模块制作也就是操作SysModule表。 首先我们来回顾一下之前的难点主要就是SysRight这个表Rightflag字段的改变,这个字段关系导航与角色组的关系显示(即有权限时候显示菜单导航,这个更新讲到授权讲到,在这里浮头一下) 所以我们操作SysModule必须更新SysRight这张表,把模块先分配给角色 所以思路已经比较明显和简单了,这里我们模块将用treegrid来做,同时也
用户1149182
2018/01/16
5.2K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(22)-权限管理系统-模块导航制作
学了这一招,爷爷再也不用担心动态排序了
在跟进一个MVC项目的后台数据显示,用户希望能点击表头来进行数据排序。虽然这个功能说简单也算简单,就一个Order by 完事;但因为其是使用EF的官方类作为数据调用,所以如果在原有的上改涉及到太多;并且其需要的是动态的排序。直接粗暴的做法就是根据其返还的排序字段进行排序。。
谭广健
2020/06/28
5580
学了这一招,爷爷再也不用担心动态排序了
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①
系统需要越来越自动化,我们需要引入日志记录和异常捕获 管理员的操作记录需要被记录,看出哪些模块是频繁操作,分析哪些是不必要的功能,哪些是需要被优化的。 系统的异常需要被捕获,而不是将系统出错显示出来给用户就不了了知。我们需要异常日志不断改进系统。 我们老说用户,我们还没有用户权限的表,所以我们在Home中先加入一个虚拟用户吧! 首先我们创建一个用户类AccountModel放在App.Models下的Sys文件夹下 using System; using System.Collections.Generic
用户1149182
2018/01/16
2K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①
ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.com/releases得到最新版本的Unity现在。 这里http://unity.codeplex.com/documentation我们找到了帮助文档大家可以下载下来看看 当然,如果您在您的visual studio 中安装了Nuget 包管理器,你可以直接在Nuget中获取到最新版本的Unity。 我们采用的是构造
用户1149182
2018/01/16
8460
ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
ASP.NET MVC5+EF6+EasyUI 后台管理系统(5)-EF增删改查
前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 回顾上一节的解决方案,我们看出了解决方案中类库的关系 这里要说明一点MVC!=三层 他们大约是这样的一种关系 代码实现 上一
用户1149182
2018/01/16
8010
ASP.NET MVC5+EF6+EasyUI 后台管理系统(5)-EF增删改查
ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
前言:由于工作原因工作流一直没时间更新,虽然没有更新,但是批阅和申请差不多,改变一下数据的状态字段就行,有几个园友已经率先完成了 说句实话,一个工作流用文章表达很难,我起初以为这是一个很简单的工作流程,但是要花很多时间考虑很多业务场景,这也是导致停滞不前的原因。 最近空出点时时间更新了皮肤,让系统看起来奇葩一点,顺便也把工作流梳理了一遍,最后跑通了整个流程的多个场景完成从提交表单到审批驳回结束流程 事隔已久需要重新梳理流程,辣么开始吧(由于我自己更新了皮肤,截图与之前有点不一样,但是除UI层之外其他还是一样
用户1149182
2018/01/16
1.2K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
Asp.Net Core 扩展 Linq,简化自定义
在 Asp.Net Core 开发中或者其他的后端开发中都会有一个需求(尤其对于中台或者后台管理),那就是展示数据列表;当然不是普普通通的数据列表展示,而是需要进行排序、分页、查询关键字来获取列表。
SpiritLing
2021/03/16
1.8K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(23)-权限管理系统-角色组模块
接下来我们的目标是 角色组管理 角色组权限设置 用户管理 把角色组授权给用户 给用户分配角色组 所以最少我们还要讲多5讲才能结束这个管理系统,经过之前的样例程序,我们很熟悉这个套路了,如果你很喜欢这个
用户1149182
2018/01/16
8350
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(23)-权限管理系统-角色组模块
ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构
前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多。主要集中增删该查每个模块都有,所以本次是为封装相同接口方法    如果你想了解怎么重构普通的接口DAL层请查看第二节点    如果你只想了解利用T4链接EF生成代码,可以忽略前两节,之后跳后最后T4模版的使用。   (代码在最后)    补充:   最后必须让初学者理解一个知识点:分部类 partial 关键字,因为我们的重构是围绕分部类而实现,包括接口 partial 关键字指示可在命名空间中定义该类、结构或接口的其他
用户1149182
2018/01/16
2K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构
ASP.NET MVC5+EF6+EasyUI 后台管理系统(49)-工作流设计-我的申请
提交一个表单后 我们需要一个管理的列表。我的申请,我的申请包含了提交内容的列表状态 状态分:过期,未审核,审核通过,驳回,废弃 列表对应代码 @using App.Admin; @using App.
用户1149182
2018/01/16
1.2K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(49)-工作流设计-我的申请
ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
前言:  这应该是本系统最后一次重构,将重构BLL层和Model层。来完全取代代码生成器生成的BLL层和DAL层。完全废掉了代码生成器的DAL,BLL,MODEL层。     全自动生成增,删,改,查的通用方法和模型转换与BLL层的模型事务脱离,后续文章,会以一些插件或功能为目的,继续完善,进行分享,最后60节的文章会对本系统做一个总结   (但是还没时间写,相信60节的文章能让你快速了解到本系统的优势和架构,就算你从未阅读之前的所有文章)    继上次的DAL层重构(上一节),本来只想重构DAL层算了,
用户1149182
2018/01/16
1.3K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
ASP.NET MVC5+EF6+EasyUI 后台管理系统(27)-权限管理系统-分配用户给角色
分配用户给角色,跟分配角色给用户操作是基本一致的。 打开模块维护,展开SysRole模块添加一个操作码,并赋予权限 设置好之后将权限授权给管理员,在SysRole的index添加操作码与js事件 @H
用户1149182
2018/01/16
1.1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(27)-权限管理系统-分配用户给角色
ASP.NET MVC5+EF6+EasyUI 后台管理系统-分配角色给用户
由于之前做了将权限赋给角色,还需要做将角色组赋给用户,和将用户赋给角色组,一个用户可以拥有多个角色组,一个角色组包含多个用户,打开模块管理,添加一个分配的操作码 并在 角色权限设置授权给他 在SysU
用户1149182
2018/01/16
1.1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统-分配角色给用户
ASP.NET MVC5+EF6+EasyUI 后台管理系统(57)-插件---ueditor使用
目录: 前言 开发环境 知识点 初始使用 自定义工具栏 设置和读取编辑器内容 文件上传 ueditor加水印 ---------------------------------------------
用户1149182
2018/01/16
1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(57)-插件---ueditor使用
ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版
本节不再适合本系统,在58,59节已经重构。请超过本节 这讲适合所有的MVC程序 很荣幸,我们的系统有了体验的地址了。演示地址 之前我们发布了一个简单的代码生成器,其原理就是读取数据库的表结构,生成文本的一个方式来生成代码! 为了替代重复的劳动,微软自己有一套T4模版,我不想把T4模版说得那么的复杂,因为这个复杂我自己也不知道。 原理跟市面的代码生成器一个道理,但是T4的扩展比代码生成器更灵活,可以更方便根据类生成代码等操作。 T4代码模式是没有颜色高亮了,但是我们的VS支持插件 T4 Editor 下载
用户1149182
2018/01/16
1.3K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版
ASP.NET MVC5+EF6+EasyUI 后台管理系统(47)-工作流设计-补充
补充一下,有人要表单的代码,这个用代码生成器生成表Flow_Form表的Index代码就可以 加上几个按钮就可以了 <div class="mvctool"> <input id="txtQuery" type="text" class="searchText" /> @Html.ToolButton("btnQuery", "icon-search", "查询", perm, "Query", true) @Html.ToolButton("btnCreate", "icon-ad
用户1149182
2018/01/16
6940
ASP.NET MVC5+EF6+EasyUI 后台管理系统(47)-工作流设计-补充
ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控
先补充一个平面化登陆页面代码,自己更换喜欢的颜色背景 @using Apps.Common; @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta content="IE=11.0000" http-equiv="X-UA-Compatible"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <tit
用户1149182
2018/01/16
9530
ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控
推荐阅读
ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
8910
ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
2.6K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
1.3K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(22)-权限管理系统-模块导航制作
5.2K0
学了这一招,爷爷再也不用担心动态排序了
5580
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①
2K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
8460
ASP.NET MVC5+EF6+EasyUI 后台管理系统(5)-EF增删改查
8010
ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
1.2K0
Asp.Net Core 扩展 Linq,简化自定义
1.8K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(23)-权限管理系统-角色组模块
8350
ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构
2K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(49)-工作流设计-我的申请
1.2K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
1.3K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(27)-权限管理系统-分配用户给角色
1.1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统-分配角色给用户
1.1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(57)-插件---ueditor使用
1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(29)-T4模版
1.3K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(47)-工作流设计-补充
6940
ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控
9530
相关推荐
ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验