(转)Entity Framework4.1实现动态多条件查询、分页和排序
原文:http://www.cnblogs.com/ahui/archive/2011/08/04/2127282.html
EF通用的分页实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/// <summary> /// 根据条件分页获得记录 /// </summary> /// <param name="where">条件</param> /// <param name="orderBy">排序</param> /// <param name="ascending">是否升序</param> /// <param name="pageIndex">当前页码</param> /// <param name="pageSize">每页大小</param> /// <param name="totalRecord">总记录数</param> /// <returns>记录列表</returns> public virtual List<T> GetMany(Expression<Func<T, bool >> where , string orderBy, bool ascending , int pageIndex, int pageSize, out int totalRecord) { totalRecord = 0; where = where .And(u => u.Flag != ( int )Flags.Delete); var list = dbset.Where( where ); totalRecord = list.Count(); if (totalRecord <= 0) return new List<T>(); list = list.OrderBy(orderBy, ascending ).Skip((pageIndex - 1) * pageSize).Take(pageSize); return list.ToList(); } |
动态排序扩展:
public static IQueryable<T> OrderBy<T>( this IQueryable<T> source, string propertyName, bool ascending ) where T : class { Type type = typeof (T); PropertyInfo property = type.GetProperty(propertyName); if (property == null ) throw new ArgumentException( "propertyName" , "Not Exist" ); ParameterExpression param = Expression.Parameter(type, "p" ); Expression propertyAccessExpression = Expression.MakeMemberAccess(param, property); LambdaExpression orderByExpression = Expression.Lambda(propertyAccessExpression, param); string methodName = ascending ? "OrderBy" : "OrderByDescending" ; MethodCallExpression resultExp = Expression.Call( typeof (Queryable), methodName, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression)); return source.Provider.CreateQuery<T>(resultExp); } |
如果要通过Expression获取字段,可以使用以下代码:
/// <summary> /// 获取对应的字段名 /// </summary> /// <typeparam name="TSource"></typeparam> /// <param name="keySelector"></param> /// <returns></returns> public static string GetMemberName<TSource, TKey>(Expression<Func<TSource, TKey>> keySelector) { string fieldName = null ; var exp = keySelector.Body as UnaryExpression; if (exp == null ) { var body = keySelector.Body as MemberExpression; fieldName = body.Member.Name; } else { fieldName = (exp.Operand as MemberExpression).Member.Name; } return fieldName; } |
多条件组合(参见老赵相关文章):
/// <summary> /// 统一ParameterExpression /// </summary> internal class ParameterReplacer : ExpressionVisitor { public ParameterReplacer(ParameterExpression paramExpr) { this .ParameterExpression = paramExpr; } public ParameterExpression ParameterExpression { get ; private set ; } public Expression Replace(Expression expr) { return this .Visit(expr); } protected override Expression VisitParameter(ParameterExpression p) { return this .ParameterExpression; } } public static class PredicateExtensionses { public static Expression<Func<T, bool >> True<T>() { return f => true ; } public static Expression<Func<T, bool >> False<T>() { return f => false ; } public static Expression<Func<T, bool >> And<T>( this Expression<Func<T, bool >> exp_left, Expression<Func<T, bool >> exp_right) { var candidateExpr = Expression.Parameter( typeof (T), "candidate" ); var parameterReplacer = new ParameterReplacer(candidateExpr); var left = parameterReplacer.Replace(exp_left.Body); var right = parameterReplacer.Replace(exp_right.Body); var body = Expression.And(left, right); return Expression.Lambda<Func<T, bool >>(body, candidateExpr); } public static Expression<Func<T, bool >> Or<T>( this Expression<Func<T, bool >> exp_left, Expression<Func<T, bool >> exp_right) { var candidateExpr = Expression.Parameter( typeof (T), "candidate" ); var parameterReplacer = new ParameterReplacer(candidateExpr); var left = parameterReplacer.Replace(exp_left.Body); var right = parameterReplacer.Replace(exp_right.Body); var body = Expression.Or(left, right); return Expression.Lambda<Func<T, bool >>(body, candidateExpr); } } |
调用示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public static PagedList<UsersDTO> GetUsers( int pageIndex, int pageSize, string orderBy, bool ascending , Companys company, string email, string nickName, bool ? isAdmin, UserStatus userStatus) { PagedList<UsersDTO> result = new PagedList<UsersDTO>(pageIndex, pageSize); int totalRecord = 0; Expression<Func<Users, bool >> where = PredicateExtensionses.True<Users>(); if (company != Companys.All) where = where .And(u => u.Company == ( int )company); if (! string .IsNullOrEmpty(email)) where = where .And(u => u.Email.Contains(email)); if (! string .IsNullOrEmpty(nickName)) where = where .And(u => u.NickName.Contains(nickName)); if (isAdmin.HasValue) { if (isAdmin.Value) where = where .And(u => u.IsAdmin == 1); else where = where .And(u => u.IsAdmin == 0); } if (userStatus != UserStatus.All) where = where .And(u => u.UserStatus == ( int )userStatus); if ( string .IsNullOrEmpty(orderBy)) orderBy = MapHelper.GetMappedName<UsersDTO, Users>(u => u.UserId); else orderBy = MapHelper.GetMappedName<UsersDTO, Users>(orderBy); List<Users> list = _usersDao.GetMany( where , orderBy, ascending , pageIndex, pageSize, out totalRecord); result.TotalRecordCount = totalRecord; foreach ( var data in list) { result.Items.Add(Mapper.Map<Users, UsersDTO>(data)); } return result; } |
上述方法的缺点是无法针对2个字段一起排序,不过只要修改排序参数还是可以实现的!
另外这种分页查询只能针对一个表或者视图
(转)Entity Framework4.1实现动态多条件查询、分页和排序的更多相关文章
- 动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版
一.前言 多条件查询分页以及排序 每个系统里都会有这个的代码 做好这块 可以大大提高开发效率 所以博主分享下自己的6个版本的 多条件查询分页以及排序 二.目前状况 不论是ado.net 还是EF ...
- EntityFramework动态多条件查询与Lambda表达式树
在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...
- Mysql动态多条件查询
动态多条件查询是一类经常遇到的问题. 在Mysql里面可以用语句简单的解决. SELECT * FROM product WHERE price = IF('{0}' = '', price, '{0 ...
- sql语句之条件,分页,排序
sql语句之条件,分页,排序
- mybatis的mapper特殊字符转移以及动态SQL条件查询
前言 我们知道在项目开发中之前使用数据库查询,都是基于jdbc,进行连接查询,然后是高级一点jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,与代码偶合,效率低下,于 ...
- Silverlight学习(四) domainservice动态多条件查询
上次讲了silverlight+MVVN+EF的简单框架,能够实现简单的数据CURD,但是多条件动态的查询一直没有实现.在网上查阅了很多资料,发现自己走了很多误区,代码很难调试正确. 这次的查询是基于 ...
- 基于Struts2、Spring、Hibernate实现的包括多条件查询分页的基础Dao层帮助jar包实现
操作数据库经常使用操作就是增删查改.每做一次就写一次这些操作太麻烦,也不是必需,特别是写多条件查询并分页时.太痛苦了,所以抽出时间写了个dao帮助jar.导入即搞定!妈妈再有不用操心我的项目了! 转载 ...
- mybatis动态sql片段与分页,排序,传参的使用与一对多映射与resultMap使用
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...
- ibatis动态多条件查询及模糊查询(oracle,mysql,sql)
首先是模糊查询的问题,开始时我使用如下条件:select * from user where name like '%#value#%'. 可是怎么也不行,好像还报错了.后来在网上找到了解决方法,就是 ...
随机推荐
- Hawk-and-Chicken 强连通
题意:一群人投票 票具有传递性 求出累计和最大的数和 哪几个人最大 强连通好题!!! 毫无疑问先强连通缩点 一开始打算拓扑排序求dis 但是发现拓扑排序会有重复累加的情况 那么就反向建图 当 ...
- c# 中virtual与abstract
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- Python学习过程(一)
Hi,最近得知了有这么一种计算机语言,名字叫Python,下面对自己从零开始学习的一个记录.被大家所熟知的语言有很多种,比如说C语言 .java .C++ .C#等,以及javascri和火的一塌糊 ...
- 最小生成树+LCA【洛谷 P2245】 星际导航
[洛谷 P2245] 星际导航 题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边 ...
- mongoDB副本集+分片集群
首先搭建一个副本集(三台机器) 主,从,仲裁 然后搭建分片shard1,在每台机子上启用shard1(这里就写一个分片吧!!如果写多了怕初学者会混乱,先写一个.然后可以按照同样的方法写第二个,第三个) ...
- springboot整合mybatis,redis,代码(五)
redis注解开发过程中包含许多注解 1.@Cacheable 可以标记在方法上,也可以标记在类上.当标记在方法上时表示该方法是支持缓存的,当标记在类上时则表示该类所有的方法都是支持缓存的.应用到读取 ...
- anglarJs分页
首先在页面引入分页插件 <script src="../plugins/angularjs/pagination.js"></script> <lin ...
- How to pass multiple parameters in PowerShell invoke-restmethod
Link: http://www.tagwith.com/question_322855_how-to-pass-parameters-in-powershell-invoke-restmethod- ...
- 老男孩python作业3-购物车程序优化
购物车优化要求:用户入口: 1.商品信息存在文件里 2.已购商品,余额记录.第一次启动程序时需要记录工资,第二次启动程序时谈出上次余额 3.允许用户根据商品编号购买商品 4.用户选择商品后,检测是否够 ...
- Linux(ubuntu)下固定IP的方法
写在前面,问:为什么要固定ip.答:要知道固定IP的好处多多,随意搬动,固定共享地址,不怕断网等等 首先,我们要选取一个局域网内的IP,方法如下: 1.选取IP号段,一般是路由器DCHP以外的IP地址 ...