将不确定变为确定~表达式树是否可以有个集合,条件过滤有了新方向续(新增了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查询),如需转载请自行联系原博主。

目录
相关文章
|
网络安全 开发工具 git
|
分布式计算 并行计算 数据库
Schedulerx2.0分布式计算原理&最佳实践
1. 前言 Schedulerx2.0的客户端提供分布式执行、多种任务类型、统一日志等框架,用户只要依赖schedulerx-worker这个jar包,通过schedulerx2.0提供的编程模型,简单几行代码就能实现一套高可靠可运维的分布式执行引擎。
26844 2
|
11月前
|
人工智能 C#
AU音乐制作之如何把音乐的音质提高于320KBps、采样率高于44.1KHz-音频文件处理-adobe audition (原Cool Edit Pro)-世界级好用软件之一
AU音乐制作之如何把音乐的音质提高于320KBps、采样率高于44.1KHz-音频文件处理-adobe audition (原Cool Edit Pro)-世界级好用软件之一
1531 66
AU音乐制作之如何把音乐的音质提高于320KBps、采样率高于44.1KHz-音频文件处理-adobe audition (原Cool Edit Pro)-世界级好用软件之一
|
8月前
|
数据采集 存储 Web App开发
轻量级爬虫框架Feapder入门:快速搭建企业级数据管道
本教程基于Feapder框架,讲解如何构建轻量级爬虫采集豆瓣电影数据。通过配置代理IP、Cookie与User-Agent,实现企业级数据管道能力,包括动态请求与信息提取(如电影名称、导演、演员等)。适合具备Python基础及爬虫原理知识的读者,提供从环境搭建到代码实现的完整流程,并分析常见错误与解决方法,助力高效开发。
359 1
轻量级爬虫框架Feapder入门:快速搭建企业级数据管道
|
11月前
|
数据采集 人工智能 搜索推荐
SocraticLM:通过 AI 提问引导学生主动思考,中科大与科大讯飞联合推出苏格拉底式教育大模型
SocraticLM 是由中科大和科大讯飞联合开发的苏格拉底式教学大模型,通过提问引导学生主动思考,提供个性化教学,显著提升教学效果。
674 9
SocraticLM:通过 AI 提问引导学生主动思考,中科大与科大讯飞联合推出苏格拉底式教育大模型
|
9月前
|
人工智能 编解码 算法
一文详解总台春晚“子弹时间”背后技术!
一文详解总台春晚“子弹时间”背后技术!
|
12月前
|
敏捷开发 持续交付 项目管理
敏捷开发下如何选择高效的协同工具?提升研发团队项目管理与沟通效率的建议
本文介绍了6款适用于软件研发团队的协同工具,包括板栗看板、Jira、Trello、Slack、GitLab和Asana,涵盖了任务管理、版本控制、文档协作等方面。每款工具都有其独特的优势和适用场景,如板栗看板适合敏捷开发的小型团队,Jira适用于大型项目的复杂管理,Trello以简洁易用著称,Slack强化团队沟通,GitLab支持CI/CD流程,Asana则擅长跨团队协作。选择合适的工具能有效提升团队效率和项目管理能力。
敏捷开发下如何选择高效的协同工具?提升研发团队项目管理与沟通效率的建议
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
626 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
搜索推荐 Android开发 数据安全/隐私保护
安卓vs. iOS:两大操作系统的终极对决####
【10月更文挑战第17天】 本文将深入浅出地探讨安卓和iOS这两大智能手机操作系统的差异与优劣,通过对比它们的技术架构、用户体验、市场表现及未来发展趋势,为读者提供一个全面而客观的视角。无论你是技术爱好者还是普通消费者,都能从中获得有价值的信息。 ####
581 2
|
运维 安全 物联网
物联网设备的安全固件更新机制:保障设备安全的基石
【7月更文挑战第4天】物联网设备的安全固件更新机制是保障设备安全、稳定运行的重要基石。通过建立完善的更新管理制度、定期检查和更新计划、安全验证和兼容性测试、自动化分发和安装、详细的更新记录、数字签名技术、分阶段或分批更新策略、紧急响应计划及加密通信协议等措施,可以显著提高物联网设备固件更新的安全性和可靠性。未来,随着技术的不断进步和应用场景的拓展,物联网设备的安全固件更新机制将不断完善和发展,为物联网系统的稳定运行和数据安全提供更加坚实的保障。

热门文章

最新文章