Linq之動態排序(字元傳入)
本文只代表作者在一定階段的認識與理解。
最近專案比較忙,沒有時間結束RDLC的系列內容。但之所以把這篇提前是因為我覺得很多人可能用的到。
一.寫作前提
最近做的是一個MVC的專案,至於MVC是個啥東西,群裡已經有很多朋友講過,這裡不再多講了,本文的前提是在MVC專案的View中顯示Table,對Table進行Sorting和Paging,我都知道View中要實現Sorting和Paging一定要有自己的Action進行響應,如果要實現Sorting和Paging,那麼我們只能把引數傳給Action,但是Action接收Sorting或Paging的引數,如何使用Linq實現Sorting和Paging呢?哎,終於說到和主題有關的了,而且還是以字元傳參的方式在Linq中進行Sorting有點難實現,這就是我寫這篇文章的目的。此文只是本人實現Linq的方法,如果高手路過請指點斧正,下面就來談一談。
二.本文內容
1. Linq中Paging的實現
2. Linq中動態排序的實現
3. 本文總結
4. 程式碼下載(下載)
三.Linq Paging的實現
其實Paging已經有很多人講過了,其文章已經是數不盡數了,其語句相對簡單,如下:
DatabaseDataContext
db = new DatabaseDataContext();
var
result = from s in db.T_BC_PRODUCTs select s;
return
result .Skip(pageNumber * pageSize).Take(pageSize);
以上的程式碼就實現了Paging的功能。好,Paging我們就說到這裡,相信大家都能明白。
四.Linq Sorting動態排序的實現(根據字元引數)
在Linq排序有很多方法,網路上關於靜態排序和部分動態排序的文章,而靜態排序相對來說比較簡單,也比較容易實現,這裡我就不提了,有需要的朋友可以到網上去搜尋,相信一大堆。哈哈!至於動態排序網上也有部分例子,但是我一個也沒有試成功,呵呵!可能我還沒有理解,所以迫於無耐就自己寫了個,還請望高手斧正。
這裡我們只說如何實現字元引數作為Linq Sorting的條件。
下面是例項步驟:
1. 建立一個頁面,加入一個Button,用來實現排序,實現如下程式碼Button1_Click所示。
2 using System.Collections;
3 using System.Configuration;
4 using System.Data;
5 using System.Linq;
6 using System.Web;
7 using System.Web.Security;
8 using System.Web.UI;
9 using System.Web.UI.HtmlControls;
10 using System.Web.UI.WebControls;
11 using System.Web.UI.WebControls.WebParts;
12 using System.Xml.Linq;
13 using System.Collections.Generic;
14 using System.Reflection;
15 using System.Linq.Expressions;
16
17 namespace LinqTest
18 {
19 public partial class _Default : System.Web.UI.Page
20 {
21 protected void Page_Load(object sender, EventArgs e)
22 {
23
24 }
25
26 protected void Button1_Click(object sender, EventArgs e)
27 {
28 GridView1.DataSource = GetSchoolList("ID","desc",0,0);
29 GridView1.DataBind();
30 }
31
32 public IQueryable<T_BC_PRODUCT> GetSchoolList(string sortExpr, string sortDir, long pageNumber, int pageSize)
33 {
34 DatabaseDataContext db = new DatabaseDataContext();
35 var result = from s in db.T_BC_PRODUCTs select s;
36 IQueryable<T_BC_PRODUCT> query = DBHelper.SortingAndPaging<T_BC_PRODUCT>(result, sortExpr, sortDir,2,3);
37 return query;
38 }
39 }
40 }
2. 在Button事件中,我們提供了字元引數“ID”,這是告訴我們按ID欄位進行排序,那我們把ID是選擇升序還是降序排列呢,這時就看後面的引數,我們這裡提供的是desc。OK,到這裡我們提供了字元引數和按什麼樣的順序進行排列,當然這裡也可以根據你的需求而傳遞不同的欄位或asc排列方式(在我的MVC進行中,這些引數是以引數的形式傳給Controller的,然後再傳遞這些引數進行排序),這裡只是用aspx.cs檔案做示例。
3. Button事件把引數傳給GetSchoolList,下面我們來分析這個方法。
這個方法其實就是我們在實現應用的時候要使用的方法,他會告訴我們應該返回什麼樣的資料型別,並且把從DB查詢的結果以及排序和分佈的引數一起傳給 DBHelper.SortingAndPaging<T_BC_PRODUCT>(result, sortExpr, sortDir,2,3);這個方法。這個方法就是我們實現排序和分頁的主要方法。
這裡要注意的是我們傳遞T_BC_PRODUCT型別,這表示,我們的排序的欄位是在些型別之中的,並且就返回此種型別的結果。SortingAndPaging方法的實現如下所示:
2 // ==============================================================================
3 // Copyright(C) 2009 Xiong Wei
4 //
5 // SYSTEM NAME :
6 // COMPONENT ID : LinqTest.DBHelper
7 // COMPONENT DESC :
8 //
9 // CREATED DATE/BY : 2009 / Xiong Wei
10 //
11 // REVISION HISTORY :
12 // DATE/BY ISSUE#/SR#/CS/PM#/OTHERS DESCRIPTION OF CHANGE
13 //
14 //
15 // ==============================================================================
16
17 #endregion
18 using System;
19 using System.Data;
20 using System.Configuration;
21 using System.Linq;
22 using System.Web;
23 using System.Web.Security;
24 using System.Web.UI;
25 using System.Web.UI.HtmlControls;
26 using System.Web.UI.WebControls;
27 using System.Web.UI.WebControls.WebParts;
28 using System.Xml.Linq;
29 using System.Reflection;
30 using System.Linq.Expressions;
31
32 namespace LinqTest
33 {
34 public static class DBHelper
35
36 {
37 public static IQueryable<T> DataSorting<T>(IQueryable<T> source, string sortExpression, string sortDirection)
38 {
39 string sortingDir = string.Empty;
40 if (sortDirection.ToUpper().Trim() == "ASC")
41 sortingDir = "OrderBy";
42 else if (sortDirection.ToUpper().Trim() == "DESC")
43 sortingDir = "OrderByDescending";
44 ParameterExpression param = Expression.Parameter(typeof(T), sortExpression);
45 PropertyInfo pi = typeof(T).GetProperty(sortExpression);
46 Type[] types = new Type[2];
47 types[0] = typeof(T);
48 types[1] = pi.PropertyType;
49 Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, source.Expression, Expression.Lambda(Expression.Property(param, sortExpression), param));
50 IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);
51 return query;
52 }
53
54 public static IQueryable<T> DataPaging<T>(IQueryable<T> source, int pageNumber, int pageSize)
55 {
56 return source.Skip(pageNumber * pageSize).Take(pageSize);
57 }
58
59 public static IQueryable<T> SortingAndPaging<T>(IQueryable<T> source, string sortExpression, string sortDirection, int pageNumber, int pageSize)
60 {
61 IQueryable<T> query = DataSorting<T>(source, sortExpression, sortDirection);
62 return DataPaging(query, pageNumber, pageSize);
63 }
64 }
65
66 }
我們對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);
執行排序
五.本文總結
通過我們應該瞭解如下知識:
1. Linq中Paging的使用。
2. Linq中Sorting的使用,本文只說明自己對sorting的實現,只作為參考,希望對你的應用有所幫助。
3. 其中有部分反射的內容,需要理解。
原文地址:http://www.cnblogs.com/jack86514/archive/2009/10/27/1590364.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-617526/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- LINQ 動態排序排序
- 強大的動態 LINQ 庫
- Linq查詢之多個排序條件排序
- C# 之 Linq to XmlC#XML
- 動態渲染之vue頁面向元件間傳值Vue元件
- LeetCode入門指南 之 排序LeetCode排序
- 排序演算法入門之「選擇排序」排序演算法
- 排序演算法入門之「插入排序」排序演算法
- 啟動優化之動態庫延遲載入優化
- LeetCode入門指南 之 動態規劃思想LeetCode動態規劃
- vue後臺管理之動態載入路由Vue路由
- Collections.sort()方法,字元排序字元排序
- DLL動態庫動態載入
- mysql字符集和字元排序MySql字元排序
- 看動畫學演算法之:排序-count排序動畫演算法排序
- 看動畫學演算法之:排序-快速排序動畫演算法排序
- [MAUI]實現動態拖拽排序網格UI排序
- 【轉】LINQ to SQL語句(1)之WhereSQL
- 福利!Python製作動態字元畫(附原始碼)Python字元原始碼
- Java連結c++動態庫實現字串的傳輸---簡單的字元拼裝返回JavaC++字串字元
- [C#.NET 拾遺補漏]13:動態構建LINQ查詢表示式C#
- 看動畫學演算法之:排序-基數排序動畫演算法排序
- Linq
- C# 中使用Linq和Lambda表示式對List進行排序C#排序
- 動態載入UserControl
- js生成動態樹狀結構及排序JS排序
- 排序之快速排序排序
- 小程式之登入態
- liunx驅動之字元裝置的註冊字元
- SpringJpa @query 中根據傳入引數(欄位)排序Spring排序
- 程式設計入門之字元編碼與亂碼程式設計字元
- 前端許可權管理之 addRoutes 動態載入路由踩坑前端路由
- python動態載入(三)Python
- QLibrary 載入動態庫
- vue 動態載入元件Vue元件
- goloader - golang動態載入Golang
- Java動態載入類Java
- QlineEdit輸入字元奇怪自動補全上一次字元而且交叉影響字元
- Lambda、Linq