Linq之动态排序(字符传入)

  本文只代表作者在一定阶段的认识与理解。 

  最近项目比较忙,没有时间结束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. 其中有部分反射的内容,需要理解。

你可能感兴趣的:(LINQ)