将不确定变为确定~表达式树是否可以有个集合,条件过滤有了新方向续(新增了OR和AND查询)

简介:

今天发表了《将不确定变为确定~表达式树是否可以有个集合,条件过滤有了新方向》文章后,马上有朋友问起,如何实现OR查询,如果实现AND查询,事实上它说的可能并不完整,完整的话应该是,“如何实现N个字段进行OR运算和AND运算”呢,没错,我在那篇文章中,条件过滤只是针对单个字段的,是一种AND运算,也是一种条件的过滤机制,即:

有条件a1,a2,a3,它的过滤方式是先过滤a1,然后在剩下的结果里过滤a2,最后再过滤a3,它相然等同于a1 && a2 && a3,但如果要实现OR运算,我的那个程序就无能为力了,看看我们伟大的JamesJim同志写的这个OR与AND为表达式树实现的扩展方法吧,呵呵 。

 1     /// <summary>
 2     /// 条件建立者
 3     /// [单元表达式主要考用用在数据库字段或是其他集合字段中考用直接返回bool查询的]
 4     /// [考用考虑,如果一个内存集合中,考用定义一个属性,属性中有逻辑,例如:return str.Lenght==1;这样的可以用到单元运算符。]
 5     /// </summary>
 6     public static class PredicateBuilder
 7     {
 8         /// <summary>
 9         /// 单元 true 表达式
10         /// </summary>
11         /// <typeparam name="T">指定泛型 T</typeparam>
12         /// <returns>true</returns>
13         public static Expression<Func<T, bool>> True<T>()
14         {
15             return item => true;
16         }
17 
18         /// <summary>
19         /// 单元 false 表达式
20         /// </summary>
21         /// <typeparam name="T">指定泛型 T</typeparam>
22         /// <returns>false</returns>
23         public static Expression<Func<T, bool>> False<T>()
24         {
25             return item => false;
26         }
27 
28         /// <summary>
29         /// 双元 Or 表达式
30         /// </summary>
31         /// <typeparam name="T">指定泛型 T</typeparam>
32         /// <param name="exprleft">左表达式</param>
33         /// <param name="exprright">右表达式</param>
34         /// <returns>返回合并表达式</returns>
35         public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> exprleft, Expression<Func<T, bool>> exprright)
36         {
37             var invokedExpr = Expression.Invoke(exprright, exprleft.Parameters.Cast<Expression>());
38             return Expression.Lambda<Func<T, bool>>(Expression.Or(exprleft.Body, invokedExpr), exprleft.Parameters);
39         }
40 
41         /// <summary>
42         /// 双元 And 表达式
43         /// </summary>
44         /// <typeparam name="T">指定泛型 T</typeparam>
45         /// <param name="exprleft">左表达式</param>
46         /// <param name="exprright">右表达式</param>
47         /// <returns>返回合并表达式</returns>
48         public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> exprleft, Expression<Func<T, bool>> exprright)
49         {
50             var invokedExpr = Expression.Invoke(exprright, exprleft.Parameters.Cast<Expression>());
51             return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(exprleft.Body, invokedExpr), exprleft.Parameters);
52         }
53     }

再配合我的统一条件功能类,进行一下改造:

 1     /// <summary>
 2     /// 功能:条件过滤类
 3     /// 作者:张占岭
 4     /// 日期:2012-6-7
 5     /// </summary>
 6     public class PredicateList<TEntity> : IEnumerable<Expression<Func<TEntity, bool>>> where TEntity : class
 7     {
 8         List<Expression<Func<TEntity, bool>>> expressionList;
 9         public PredicateList()
10         {
11             expressionList = new List<Expression<Func<TEntity, bool>>>();
12         }
13         /// <summary>
14         /// 添加到集合
15         /// </summary>
16         /// <param name="predicate"></param>
17         public void Add(Expression<Func<TEntity, bool>> predicate)
18         {
19             expressionList.Add(predicate);
20         }
21         /// <summary>
22         /// Or操作添加到集合
23         /// </summary>
24         /// <param name="exprleft"></param>
25         /// <param name="exprright"></param>
26         public void AddForOr(Expression<Func<TEntity, bool>> exprleft, Expression<Func<TEntity, bool>> exprright)
27         {
28             expressionList.Add(exprleft.Or(exprright));
29         }
30         /// <summary>
31         /// And操作添加到集合
32         /// </summary>
33         /// <param name="exprleft"></param>
34         /// <param name="exprright"></param>
35         public void AddForAnd(Expression<Func<TEntity, bool>> exprleft, Expression<Func<TEntity, bool>> exprright)
36         {
37             expressionList.Add(exprleft.And(exprright));
38         }
39 
40         #region IEnumerable 成员
41 
42         public IEnumerator GetEnumerator()
43         {
44             return expressionList.GetEnumerator();
45         }
46 
47         #endregion
48 
49         #region IEnumerable<Expression<Func<TEntity>>> 成员
50 
51         IEnumerator<Expression<Func<TEntity, bool>>> IEnumerable<Expression<Func<TEntity, bool>>>.GetEnumerator()
52         {
53             return expressionList.GetEnumerator();
54         }
55 
56         #endregion
57     }

嘿嘿,这样就可以把一些用到做AND或者OR的条件先进行组成,最后再和其它条件一起过滤,就OK了,呵呵。

调用时,可以这样:

1             PredicateList<UserBases> zzl = new PredicateList<UserBases>();
2             Expression<Func<UserBases, bool>> exp_name = i => i.Name.Contains("zzl");
3             Expression<Func<UserBases, bool>> exp_id = i => i.UserID == 1;
4             zzl.AddForOr(exp_name, exp_id);
5             GetModel(zzl).ForEach(i => Console.WriteLine(i.Name));
6             Console.ReadKey();

OK,世界上对于i.Name和i.UserID的赋值,是我们在业务上判断过的,在PredicateList中存在的过滤条件就是真实要被过滤的。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:将不确定变为确定~表达式树是否可以有个集合,条件过滤有了新方向续(新增了OR和AND查询),如需转载请自行联系原博主。

目录
相关文章
|
1月前
|
存储 语音技术 索引
语音识别,列表的定义语法,列表[],列表的下标索引,从列表中取出来特定的数据,name[0]就是索引,反向索引,头部是-1,my[1][1],嵌套列表使用, 列表常用操作, 函数一样,需引入
语音识别,列表的定义语法,列表[],列表的下标索引,从列表中取出来特定的数据,name[0]就是索引,反向索引,头部是-1,my[1][1],嵌套列表使用, 列表常用操作, 函数一样,需引入
|
3月前
|
C#
C#动态查询:巧用Expression组合多条件表达式
在C#中,利用`Expression`类和`AndAlso`、`OrElse`方法,可以组合两个`Expression&lt;Func&lt;T, bool&gt;&gt;`以实现动态多条件查询。该方法通过构建表达式树,方便地构建复杂查询。示例代码展示了如何创建表达式树,分别检查年龄大于等于18和姓名为&quot;John&quot;的条件,并使用`AndAlso`组合这两个条件,最终编译为可执行的委托进行测试。
101 1
|
Java
高效实现区间条件过滤:Java字符串转换为条件语句
高效实现区间条件过滤:Java字符串转换为条件语句
71 0
|
8月前
哇,三目(条件)的顺序真有趣
@(太开心) 今天看到这样的代码
27 1
|
3月前
有关筛选条件的问题
有关筛选条件的问题
29 0
|
9月前
根据select下拉框值判断验证条件
根据select下拉框值判断验证条件
34 0
判断两棵树是否完全一致
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
103 0
|
移动开发 JavaScript 算法
如何实现动态内容条件筛选
这两天看了一下后端给的接口文档,每一个都要求筛选,而且这个筛选还是多条件的,还是不能固定的,要求根据用户的输入然后筛选,我之前的实现大概是这样子,当用户想要筛选的时候就去检索条件,并输入相关的内容进行筛选
|
关系型数据库 MySQL
ES复杂操作-布尔值查询(多条件精确查询)
ES复杂操作-布尔值查询(多条件精确查询)
ES复杂操作-精确查询多个值和高亮显示
ES复杂操作-精确查询多个值和高亮显示