Linq之动态排序(字符传⼊)
最近做的是⼀个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的实现
cur什么意思2. Linq中动态排序的实现
3. 本⽂总结
4. 代码下载()
英语发音词典下载三.Linq Paging的实现
submitted
其实Paging已经有很多⼈讲过了,其⽂章已经是数不尽数了,其语句相对简单,如下:
DatabaDataContext db = new DatabaDataContext();
var result = from s in db.T_BC_PRODUCTs lect s;
return result .Skip(pageNumber * pageSize).Take(pageSize);西班牙音乐
以上的代码就实现了Paging的功能。好,Paging我们就说到这⾥,相信⼤家都能明⽩。
四.Linq Sorting动态排序的实现(根据字符参数)
在Linq排序有很多⽅法,⽹络上关于静态排序和部分动态排序的⽂章,⽽静态排序相对来说⽐较简单,也⽐较容易实现,这⾥我就不提了,有需要的朋友可以到⽹上去搜索,相信⼀⼤堆。哈哈!⾄于动态排序⽹上也有部分例⼦,但是我⼀个也没有试成功,呵呵!可能我还没有理解,所以迫于⽆耐就⾃⼰写了个,还请望⾼⼿斧正。
这⾥我们只说如何实现字符参数作为Linq Sorting的条件。
下⾯是实例步骤:
.创建⼀个页⾯,加⼊⼀个Button,⽤来实现排序,实现如下代码Button1_Click所⽰。
1using System;
2using System.Collections;
3using System.Configuration;
4using System.Data;
still是什么意思5using System.Linq;
6using System.Web;
7using System.Web.Security;
8using System.Web.UI;
9using System.Web.UI.HtmlControls;
10using System.Web.UI.WebControls;
11using System.Web.UI.WebControls.WebParts;
12using System.Xml.Linq;
13using System.Collections.Generic;
14using System.Reflection;
15using System.Linq.Expressions;
16
17namespace LinqTest
18{google code jam
19public partial class _Default : System.Web.UI.Page
20 {
21protected void Page_Load(object nder, EventArgs e)
22 {
23
24 }
25
26protected void Button1_Click(object nder, EventArgs e)
27 {
28 GridView1.DataSource = GetSchoolList("ID","desc",0,0);
29 GridView1.DataBind();
30 }
31
32public IQueryable<T_BC_PRODUCT> GetSchoolList(string sortExpr, string sortDir, long pageNumber, int
pageSize)
33 {
34 DatabaDataContext db =new DatabaDataContext();
35 var result = from s in db.T_BC_PRODUCTs lect s;
36 IQueryable<T_BC_PRODUCT> query = DBHelper.SortingAndPaging<T_BC_PRODUCT>
(result, sortExpr, sortDir,2,3);
37return query;bore
38 }
39 }
40}
. 在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 rerved.
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
18using System;
19using System.Data;
20using System.Configuration;
21using System.Linq;
22using System.Web;
23using System.Web.Security;
24using System.Web.UI;
25using System.Web.UI.HtmlControls;
26using System.Web.UI.WebControls;
27using System.Web.UI.WebControls.WebParts;
28using System.Xml.Linq;
29using System.Reflection;
30using System.Linq.Expressions;
31
32namespace LinqTest
33{
34public static class DBHelper
35
you should get over me
36 {
37public static IQueryable<T> DataSorting<T>(IQueryable<T> source, string sortExpression, string
sortDirection)
38 {
39string sortingDir =string.Empty;
40if (sortDirection.ToUpper().Trim() =="ASC")
lohacell
41 sortingDir ="OrderBy";
42el 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);
51return query;
52 }
53
54public static IQueryable<T> DataPaging<T>(IQueryable<T> source, int pageNumber, int pageSize)
55 {
56return source.Skip(pageNumber * pageSize).Take(pageSize);
57 }
58
59public 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);
62return 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; 取出我们把什么类型的字段进⾏排序(即传⼊参数的值类型)
⽣成排序表达式
IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);武汉理工大学专升本
执⾏排序
五.本⽂总结
通过我们应该了解如下知识:
1. Linq中Paging的使⽤。
2. Linq中Sorting的使⽤,本⽂只说明⾃⼰对sorting的实现,只作为参考,希望对你的应⽤有所帮助。
3. 其中有部分反射的内容,需要理解。