将不确定变为确定~表达式树是否可以有个集合,条件过滤有了新方向

简介:

对于我之前项目中的统一条件过滤采用了dictinary来实现的,优点就是方法签名统一了,缺点不用说,就是字典的键容易写错,感觉一进入.net3.5之后,一切都要和Expression联系在一起,我们在创建一个Expression(表达式树)时,可以使用lambda表达式去创建,很容易:

1 Expression<Func<string, bool>> predicate= name=>name=="zzl";

可以看到,它其它由一个委托组成,输入参数是个字符,输出是个布尔值,在LINQ中这种技术被广泛的使用在扩展方法中,如Where扩展方法:

 1  public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
 2         {
 3             if (source == null)
 4             {
 5                 throw System.Linq.Error.ArgumentNull("source");
 6             }
 7             if (predicate == null)
 8             {
 9                 throw System.Linq.Error.ArgumentNull("predicate");
10             }
11             return source.Provider.CreateQuery<TSource>(Expression.Call(null, ((MethodInfo) MethodBase.GetCurrentMethod()).MakeGenericMethod(new Type[] { typeof(TSource) }), new Expression[] { source.Expression, Expression.Quote(predicate) }));
12         }

无可厚非,表达式树的出现,lambda表达式的支持,是.net开发人员的福音,也是.net3.5中更大的亮点了。

说正文了,以前我的写统一的参数签名时,使用的是dictionary,代码中可以是这样的

1         Common.VPredication vp = new Common.VPredication();
2             Common.PagingParam pp = new Common.PagingParam(page ?? 1, VConfig.WebConstConfig.PageSize);
3 
4             vp.AddItem("userId", userID);
5             if (_gid != 0)
6                 vp.AddItem("gid", _gid);

统一的方法签名:

1  Common.Page.PagedList<Entity.Res_Item> GetList(Common.VPredication vp, Common.PagingParam pp)

而有了表达式树的集合后,完成可以把过滤条件写在它里面,这样构建条件变成了这样:

1        PredicateList<UserBases> zzl = new PredicateList<UserBases>();
2             zzl.Add(i => i.Name.Contains("zzl"));
3             zzl.Add(i => i.UserID == 1);
4             GetModel(zzl).ForEach(i => Console.WriteLine(i.UserID + i.Name));

而方法签名仍然是很统一,只是变成了表达式树的样子,有点强类型的味道,呵呵:

1 List<UserBases> GetModel(PredicateList<UserBases> param)

而PredicateList类型的原代码,我也公开一下吧,呵呵,大家一共分享:

 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         /// 从集合中移除
23         /// </summary>
24         /// <param name="predicate"></param>
25         public void Remove(Expression<Func<TEntity, bool>> predicate)
26         {
27             expressionList.Remove(predicate);
28         }
29         #region IEnumerable 成员
30 
31         public IEnumerator GetEnumerator()
32         {
33             return expressionList.GetEnumerator();
34         }
35 
36         #endregion
37 
38         #region IEnumerable<Expression<Func<TEntity>>> 成员
39 
40         IEnumerator<Expression<Func<TEntity, bool>>> IEnumerable<Expression<Func<TEntity, bool>>>.GetEnumerator()
41         {
42             return expressionList.GetEnumerator();
43         }
44 
45         #endregion
46     }

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

目录
相关文章
|
1天前
|
云安全 人工智能 自然语言处理
|
6天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
316 116
|
8天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
619 53
Meta SAM3开源:让图像分割,听懂你的话
|
21天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
5天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
|
4天前
|
弹性计算 人工智能 Cloud Native
阿里云无门槛和有门槛优惠券解析:学生券,满减券,补贴券等优惠券领取与使用介绍
为了回馈用户与助力更多用户节省上云成本,阿里云会经常推出各种优惠券相关的活动,包括无门槛优惠券和有门槛优惠券。本文将详细介绍阿里云无门槛优惠券的领取与使用方式,同时也会概述几种常见的有门槛优惠券,帮助用户更好地利用这些优惠,降低云服务的成本。
272 132
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
423 29
|
15天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
729 224

热门文章

最新文章