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 上一節我們已經搭建好項目的基本骨架,現在我們就來對項目的整體結構進行規劃,項目結構規劃每個人每個公司都有不同的方式,我們不去論好壞還是是否合理,只要你當前覺得它是最好的實現就好,不過我還是建議去參