1. 程式人生 > >ASP.NET MVC5+EF6+EasyUI 後臺管理系統(17)-LinQ動態排序

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

我們的程式碼頓時精簡成了一行,贊一個吧。

相關推薦

ASP.NET MVC5+EF6+EasyUI 後臺管理系統17-LinQ動態排序

系列目錄 首先修復程式中的一個BUG這個BUG在GridPager類中,把sord修改為sort這個名稱填寫錯誤,會導致後臺一直無法獲取datagrid的排序欄位 本來是沒有這一講的,為了使20行的程式碼精簡成2行,我查閱了一些資料,借鑑了一些大神的建議,首先感謝第八講中,1

ASP.NET MVC5+EF6+EasyUI 後臺管理系統1-前言與目錄持續更新中...

編碼規範 圖標 pri log 任務 ros 部署 基本 form 開發工具:VS2015(2012以上)+SQL2008R2以上數據庫    您可以有償獲取一份最新源碼聯系QQ:729994997 價格 666RMB 升級後界面效果如下: 日程管理 http://

ASP.NET MVC5+EF6+EasyUI 後臺管理系統65-MVC WebApi 用戶驗證 (1)

screen 屬性 access override jquery true mod 解析 action 系列目錄 前言: WebAPI主要開放數據給手機APP,其他需要得知數據的系統,或者軟件應用,所以移動端與系統的數據源往往是相通的。 Web 用戶的身份驗證,及

ASP.NET MVC5+EF6+EasyUI 後臺管理系統4-創建項目解決方案

構建 文章 數據庫 操作 webapi http 業務 pps 技術分享 系列目錄 前言 為了符合後面更新後的重構系統,文章於2016-11-1日重寫 設計中術語,概念這種東西過於模糊,我們必須學習累積才能認識這些概念模型。 我無法用文章來下詳細解析此系統的深層概念,需要

ASP.NET MVC5+EF6+EasyUI 後臺管理系統87-MVC Excel導入和導出

.net本文示例代碼下載: 鏈接:http://pan.baidu.com/s/1jHBdgCA 密碼:hzh7ps:Vs數據庫腳本在解壓目錄下,修改web.config數據庫鏈接,示例代碼包含:導入,導出,上傳前言:導入導出實在多例子,很多成熟的組建都分裝了導入和導出,這一節演示利用LinqToExcel組

ASP.NET MVC5+EF6+EasyUI 後臺管理系統62-EF鏈接串加密

image title orm mst .... 比較 string類 sin isn 前言:   這一節提供一個簡單的功能,這個功能看似簡單,找了一下沒找到EF鏈接數據庫串的加密幫助文檔,只能自己寫了,這樣也更加符合自己的加密要求 有時候我們發布程序為了避免程序外的

ASP.NET MVC5+EF6+EasyUI 後臺管理系統88-Excel匯入和匯出-主從表結構匯出

前言 前面一篇詳細講解了匯入匯出,本節演示混合結構的匯出功能!同時提供程式碼下載.. 先看效果圖:這個一個混合的Excel,列表與自定義資訊的混合!   我們的步驟大概分為以下幾步 1.模擬資料庫資料 2.建立工作簿 3.填充固定資料 4.合併單元格 5.處理動態資料  

ASP.NET MVC5+EF6+EasyUI 後臺管理系統20-許可權管理系統-根據許可權獲取選單

系列目錄 不知不覺到20講,真是漫長的日子,可惜最近工作挺忙,要不可以有更多的時間來更新,多謝大家的一路支援.如果你覺得好,記得幫我點選推薦^-^ 我們在之前已經插入一些真實資料,其中包含了一個使用者和樣例程式SysSample的許可權,並實現了使用者的登入。 但有的朋友對錶

ASP.NET MVC5+EF6+EasyUI 後臺管理系統90-EF 批量操作

這次我們來看 EntityFramework-Plus(免費開源) 庫的用法相比其他擴充套件庫,這個更加新並且用法更加簡單這是一個對Entity Framework進行擴充套件的類庫.支援EF EF5, EF6, EF Core,來彌補EF目前的短板GitHub地址 http

ASP.NET MVC5+EF6+EasyUI 後臺管理系統5-EF增刪改查

using System; using System.Collections.Generic; using System.Linq; using Apps.Models; using Apps.Common; using Apps.IBLL; using Apps.IDAL; using Apps.DAL;

ASP.NET MVC5+EF6+EasyUI 後臺管理系統33-MVC 表單驗證

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.DataAnnotations; using System.Web.Mvc; u

ASP.NET MVC5+EF6+EasyUI 後臺管理系統89-國際化,本地化,多語言應用

開篇 早年寫過一篇多語言的應用 :   本地化(多語言)   講述瞭如何建立多語言的資原始檔,並利用資原始檔來獲得頁面和請求的語言屬性 本次補充這篇文章,的原因是在實際專案中,有多種需要多語言的情況 比如:日誌要根據當前語言顯示 而有些情景比較複雜,我們可能的key是

ASP.NET MVC5+EF6+EasyUI 後臺管理系統-WebApi的用法與除錯

以往我們講了WebApi的基礎驗證,但是有新手經常來問我使用的方式 這次我們來分析一下程式碼的用法,以及除錯的方式 WebApi在一些場景我們會用到,比如: 1.對接各種客戶端(移動裝置) 2.構建常見的http微服務  3.開放資料  4.單點登陸  等...

ASP.NET MVC5+EF6+EasyUI 後臺管理系統-分配角色給使用者

系列目錄 由於之前做了將許可權賦給角色,還需要做將角色組賦給使用者,和將使用者賦給角色組,一個使用者可以擁有多個角色組,一個角色組包含多個使用者,開啟模組管理,新增一個分配的操作碼 並在 角色許可權設定授權給他 在SysUser的Index新增以下按鈕 @Html.To

ASP.NET MVC5+EF6+EasyUI 後臺管理系統 (原始碼購買說明)

系列目錄 方便朋友獲取一個開發框架,無論是開發還是學習用途將受益匪淺,出售此框架原始碼價格666,終身免費升級,線上解答問題 您可以通過QQ 729994997 聯絡我 2017-11-10 更新:

構建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x註入的後臺管理系統66-MVC WebApi 用戶驗證 (2)

簡單 權限管理 mark 調用接口 cat pps 總結 回顧 bsp 前言: 構建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x註入的後臺管理系統(65)-MVC WebApi 用戶驗證 (1) 回顧上一節,我們利用w

react搭建後臺管理系統

管理系 for menu port 文件中 segment 後臺管理 ans create 先準備工具:  yarn安裝:    npm install -g yarn #yarn也是包管理工具,只不過它構建效率更高    官方使用教程:https://yarnpkg.

從零搭建java後臺管理系統

pac 阿裏 stat 技術 user 日誌 代碼 最小 mbo 框架搭建 一、初步設想,使用springboot,框架打算用到依賴 spring web,devTools,mysql,Aspect,Redis,Lombok,Freemark,Shiro,Rabbitmq

從零搭建java後臺管理系統mysql和redis安裝

docker 權限 req 安全性 分享圖片 登錄 red 解析 append 接上篇開始安裝mysql和redis 註意了,如果用阿裏雲服務器,外網訪問的端口必須在安全組開啟,否則外網訪問不通 三、服務器安裝redis和mysql 本次環境搭建將所有第三方服務會安

angular6 + ng-zorro鹿途後臺管理系統項目結構規劃

風格 shared 形式 route rgb 最好 導航 出口 ref 上一節我們已經搭建好項目的基本骨架,現在我們就來對項目的整體結構進行規劃,項目結構規劃每個人每個公司都有不同的方式,我們不去論好壞還是是否合理,只要你當前覺得它是最好的實現就好,不過我還是建議去參