通过Expression类进行动态构造lamda表达式。
实现了以下几种类型,好了代码说话:
public Expression<Func<T, bool>> GetAndLambdaExpression<T>(string[] keys,object[] values,string[] methons)
{
Expression expression_return = Expression.Constant(true); Type TType = typeof(T); ParameterExpression expression_param = Expression.Parameter(TType, "p"); Expression temp; for (int i = 0; i < keys.Length; i++) { switch (methons[i]) { case "=": temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), TType.GetMethod("ToString")), Expression.Constant(values[i])); expression_return = Expression.And(expression_return, temp); break; case "%": temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), typeof(string).GetMethod("Contains"), Expression.Constant(values[i], typeof(string))); expression_return = Expression.And(expression_return, temp); break; case ">": //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), // TType.GetProperty(keys[i]).GetType().GetMethod("GreaterThan"), Expression.Constant(values[i])); temp = Expression.GreaterThan(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i]))); expression_return = Expression.And(expression_return, temp); break; case "<": //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), // Expression.GetType().GetMethod("LessThan"), Expression.Constant(values[i])); temp=Expression.LessThan(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i]))); expression_return = Expression.And(expression_return, temp); break; case ">=": //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), // TType.GetProperty(keys[i]).GetType().GetMethod("GreaterThanOrEqual"), Expression.Constant(values[i])); temp = Expression.GreaterThanOrEqual(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i]))); expression_return = Expression.And(expression_return, temp); break; case "<=": //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), // TType.GetProperty(keys[i]).GetType().GetMethod("LessThanOrEqual"), Expression.Constant(values[i])); temp = Expression.LessThanOrEqual(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i]))); expression_return = Expression.And(expression_return, temp); break; case "in": string[] strarr = values[i].ToString().Split(','); Expression or_return = Expression.Constant(false); for (int k = 0; k < strarr.Length; k++) { temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), TType.GetMethod("ToString")), Expression.Constant(strarr[k])); or_return = Expression.Or(or_return, temp); } expression_return = Expression.And(expression_return, or_return); break; } } return (Expression<Func<T, bool>>)Expression.Lambda<Func<T, bool>>(expression_return, new ParameterExpression[] { expression_param });
}
IList<People> peopleList = new List<People>(); for (int i = 1; i <= 6; i++) { People people = new People() { Name = "Dai_" + i.ToString(), Age = 16, Birthday = DateTime.Now, IsBuyCar = true, Sex = "F" }; peopleList.Add(people); } Expression<Func<People, bool>> func_a = GetAndLambdaExpression<People>(new string[] { "Name", "Age" }, new string[] { "Dai_2", "16" }, new string[] { "=", "<" }); var people_data = peopleList.AsEnumerable().Where(func_a.Compile()).ToList();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2017-02-07 C# Asp.net 制作一个windows服务
2017-02-07 asp.net基于windows服务实现定时发送邮件的方法
2017-02-07 Javascript定义类(class)的最新方法
2017-02-07 怎样用Javascript定义一个类
2017-02-07 asp.net DropDownList实现二级联动效果
2017-02-07 .Net中的序列化和反序列化详解
2017-02-07 jQuery页面刷新(局部、全部)问题分析