本文只代表作者在一定阶段的认识与理解。
最近项目比较忙,没有时间结束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所示。
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. 其中有部分反射的内容,需要理解。