用PredicateBuilder实现Linq动态拼接查询
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用PredicateBuilder实现Linq动态拼接查询,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2892字,纯文字阅读大概需要5分钟。
内容图文
![用PredicateBuilder实现Linq动态拼接查询](/upload/InfoBanner/zyjiaocheng/1057/b35861e7a315437eaad3bc70c7d15529.jpg)
在使用Linq查询的时候,特别是如果你在使用Entiry Framwork,有时会遇到动态查询的情况(客户的查询条件是不固定的拼接查询)。
我们能想到的第一方案应该是拼接SQL,的确这样是可以达到我们的目的的。但这样又会破坏程序的一至性,本来使用Entiry Framwork的目标就是用面向对象的方式操纵数据库,这样我们又要开始写SQL语句了。
其实我一开始也是这样做的直到有一天我们部门的美女程序员给我介绍LinqKit,我才开始用PredicateBuilder来拼接Predicate委托。
PredicateBuilder是LinqKit库的一部分,下面是PredicateBuilder源代码:
using System; using System.Linq; using System.Linq.Expressions; namespace LinqUtil { public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T>() { return f => true; } publicstatic Expression<Func<T, bool>> False<T>() { return f => false; } publicstatic Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); return Expression.Lambda<Func<T, bool>> (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters); } publicstatic Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); return Expression.Lambda<Func<T, bool>> (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters); } } }
这里主要是介绍PredicateBuilder的使用,如想了解PredicateBuilder具体是怎么实现的可以看看这篇文章:传送门
引入PredicateBuilder依赖
- 用VS的NuGet安装LinqKit
- 直接引用上面的源码
创建PredicateBuilder对象
var where = PredicateBuilder.True<TrendStatics>();
可以理解为创建一个初始化为True的Predicate。
注意:如果你是要创建一个OR组成的Predicate就不能把它初始化为True因为这样这个表达试永远为True了。
var where = PredicateBuilder.False<TrendStatics>();
可以理解为创建一个初始化为False的Predicate。
注意:如果你是要创建一个AND组成的Predicate就不能把它初始化为False因为这样这个表达试永远为False了。
PredicateBuilder对象拼接
现在你可以对Predicate进行各种拼接了
- 全And:
-
var where = PredicateBuilder.True<int>(); where = where.And(x => x >= 50); where = where.And(x => x <= 70); var res = list.Where(where.Compile());
- 全Or:
-
var list = Enumerable.Range(1, 100); var where = PredicateBuilder.False<int>(); where = where.Or(x => x == 50); where = where.Or(x => x == 70); var res = list.Where(where.Compile());
- 各种组合:
-
var list = Enumerable.Range(1, 100); var where = PredicateBuilder.True<int>(); where = where.And(x => x >= 50); where = where.And(x => x <= 70); var subwhere = PredicateBuilder.False<int>(); subwhere = subwhere.Or(x => x == 60); subwhere = subwhere.Or(x => x == 61); where = where.And(subwhere); var res = list.Where(where.Compile());
PredicateBuilder对象使用
- 针对集合Linq查询
你可以这样用:
var res = list.Where(where.Compile());
你还可以这样用:
var res = list.AsQueryable().Where(where);
- 针对Entity Framework:
var res = table.Where(where.Expand());
转载请注明出处:http://www.cnblogs.com/keitsi/p/5621136.html
原文:http://www.cnblogs.com/qq52117354/p/7773262.html
内容总结
以上是互联网集市为您收集整理的用PredicateBuilder实现Linq动态拼接查询全部内容,希望文章能够帮你解决用PredicateBuilder实现Linq动态拼接查询所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。