博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Linq之动态排序(字符传入)
阅读量:6849 次
发布时间:2019-06-26

本文共 5602 字,大约阅读时间需要 18 分钟。

 最近做的是一个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://ceeul.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
子数组的和的最大值(包括升级版的首尾相连数组)
查看>>
LeetCode - Nth Highest Salary
查看>>
9.ORM数据访问
查看>>
href=“javascript:”vs href=“javascript:void(0)”
查看>>
win10文件夹无法打开,双击闪屏
查看>>
【学习笔记14】全局类型转换器
查看>>
Spring Boot学习记录手册<1>
查看>>
在Word2007和Word2010中插入视频文件,并自动在word中播放
查看>>
javascript设置http请求的头信息
查看>>
C++调用java开启远程调试
查看>>
struts2与ajax交互
查看>>
Linux Shell脚本中点号和source命令
查看>>
Unix常用基本数据类型
查看>>
索尼竟用人工智能写了两首流行歌
查看>>
私有云portal
查看>>
Hadoop-环境搭建
查看>>
远程登录ssh免密码
查看>>
Linux下map hash_map和unordered_map效率比较
查看>>
Python学习笔记(二)网络编程的简单示例
查看>>