構建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的後台管理系統(17)-LinQ動態排序

來源:互聯網
上載者:User

標籤:

首先修複程式中的一個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 MVC4+EF5+EasyUI+Unity2.x注入的後台管理系統(17)-LinQ動態排序

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.