Linq之動態排序(字元傳入)

iDotNetSpace發表於2009-10-27

本文只代表作者在一定階段的認識與理解。 

  最近專案比較忙,沒有時間結束RDLC的系列內容。但之所以把這篇提前是因為我覺得很多人可能用的到。

.寫作前提

   最近做的是一個MVC的專案,至於MVC是個啥東西,群裡已經有很多朋友講過,這裡不再多講了,本文的前提是在MVC專案的View中顯示Table,對Table進行SortingPaging,我都知道View中要實現SortingPaging一定要有自己的Action進行響應,如果要實現SortingPaging,那麼我們只能把引數傳給Action,但是Action接收SortingPaging的引數,如何使用Linq實現SortingPaging呢?哎,終於說到和主題有關的了,而且還是以字元傳參的方式在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所示。

 1 using System;
 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方法的實現如下所示:

 1 #region Copyright(C) 2009 Xiong Wei All rights reserved.
 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章