动态创建 Lambda 表达式

首先我们看一个简单 Lambda 表达式的构成。

i => i > 5

在这个表达式中,"i" 被称为 Parameter,"i > 5" 是 Body。我们可以对 Body 进行更进一步的分解,那么 "i > 5" 分别包含参数(i)、操作符(>)以及一个常数(5)。所有这些通过特定顺序的组合,从而构建一个完整的 Lambda 表达式。

我们通过一些例子,来学习如何动态构建这些表达式。

例子1

            var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            //list = list.Where(i => i > 5);  //要实现的表达式

            // 创建参数 i
            var parameter = Expression.Parameter(typeof(int), "i");

            // 创建常量 5
            var constant = Expression.Constant(5);

            // 创建比较表达式 i > 5
            var body = Expression.GreaterThan(parameter, constant);

            // 获取Lambda表达式
            var lambda = Expression.Lambda<Func<int, bool>>(body, parameter);

            // 通过 Compile 方法获取 Delegate
            var _r = list.Where(lambda.Compile());

例子2

            var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            //list = list.Where(i => i > 5 && i <= 7); // 要实现的表达式

            // 创建参数 i
            var parameter = Expression.Parameter(typeof(int), "i");

            // 创建常量 5
            var constant1 = Expression.Constant(5);

            // 创建比较表达式 i > 5
            var left = Expression.GreaterThan(parameter, constant1);

            // 创建常量 7
            var constant2 = Expression.Constant(7);

            // 创建比较表达式 i <= 7
            var right = Expression.LessThanOrEqual(parameter, constant2);

            var body = Expression.And(left,right);

            // 获取Lambda表达式
            var lambda = Expression.Lambda<Func<int, bool>>(body, parameter);

            // 通过 Compile 方法获取 Delegate
            var _r = list.Where(lambda.Compile());

例子3

            var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            //list = list.Where(i => (i > 5 && i <= 7) || (i == 3)); // 要实现的表达式

            // 创建参数 i
            var parameter = Expression.Parameter(typeof(int), "i");

            // 创建常量 5
            var constant1 = Expression.Constant(5);

            // 创建比较表达式 i > 5
            var left1 = Expression.GreaterThan(parameter, constant1);

            // 创建常量 7
            var constant2 = Expression.Constant(7);

            // 创建比较表达式 i <= 7
            var left2 = Expression.LessThanOrEqual(parameter, constant2);

            // 创建常量 3
            var constant3 = Expression.Constant(3);

            // 创建比较表达式 i == 3
            var right = Expression.Equal(parameter, constant3);

            //创建表达式 i>5 && i<=7
            var left = Expression.And(left1,left2);

            //创建表达式 i>5 && i<=7
            var body = Expression.Or(left, right);

            // 获取Lambda表达式 (i > 5 && i <= 7) || (i == 3)
            var lambda = Expression.Lambda<Func<int, bool>>(body, parameter);

            // 通过 Compile 方法获取 Delegate
            var _r = list.Where(lambda.Compile());

例子4

            var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            //var res = list.Select(i => i % 2 == 0 ? i : 0); // 要实现的表达式

            // 创建参数 i
            var parameter = Expression.Parameter(typeof(int), "i");

            // 创建表达式 i % 2
            var constant1 = Expression.Constant(2);
            var left1 = Expression.Modulo(parameter, constant1);

            // 创建表达式 (i % 2) == 0
            var constant2 = Expression.Constant(0);
            var left = Expression.Equal(left1, constant2);

            // 创建表达式 i % 2 == 0 ? i : 0
            var bin3 = Expression.Condition(left, parameter, Expression.Constant(0));

            var lambda = Expression.Lambda<Func<int, int>>(bin3, parameter);
            var _r = list.Select(lambda.Compile());

例子5

            var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            //list.ForEach(i => Console.WriteLine(i)); // 要实现的表达式

            // 创建参数i
            var parameter = Expression.Parameter(typeof(int), "i");

            // 获取 Console.WriteLine MethodInfo
            MethodInfo method = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(int) });

            // 创建表达式
            var call = Expression.Call(method, parameter);

            var lambda = Expression.Lambda<Action<int>>(call, parameter);
            list.ForEach(lambda.Compile());

动态创建表达式树就到此为止啦,其他的可以参考以上案例!

时间: 2024-08-29 22:55:05

动态创建 Lambda 表达式的相关文章

动态生成lambda表达式

//1.0 获取我的申请单 int uid = UserMgr.GetCurrentLoginUser().uID; //2.0 获取参数 string kname = f["kname"]; string status = f["status"]; //第一个条件: var query= c => c.fCreatorID == uid //定义出一个c的参数,它的类型为wfReqeustForm var ps = Expression.Parameter(

动态组合lambda 表达式

//第三方审核记录实体集合—动态组合lambda 表达式 Expression<Func<ThirdAdEntity, bool>> thirdWhere = p => p.Observer.Split(',').Contains(ortableEntity.CompanyAdtId.ToString()) && p.AdStartDate <= commonProperty.SystemDateTime && p.ThirdAdId !

取代DataTable Select方法 并动态拼接Lambda表达式

原来的程序里面,有这样一段代码 var parentFilterString = string.Empty; parentFilterString = exceptList.Aggregate(parentFilterString, (current, id) => current + (" " + parentFieldName + " = '" + id + "' or")); parentFilterString = parentFi

动态构建Lambda表达式实现EF动态查询

在使用Entity Framework做数据查询的时候,查询条件往往不是固定的,需要动态查询.可以通过动态构建Lamda表达式来实现动态查询. Lamda表达式 使用Lamda表达式可以很方便的按条件过滤数据.Entity Framework也是将Lamda表达式转换成对应的SQL语句执行. 比如下列代码,输出年龄大于1的人的名字: namespace ConsoleApp { public class Person { public string Name { get; set; } publ

根据表达式树动态生成Lambda表达式

1.准备 环境:Asp.Net MVC5 .EF6 前置知识:反射.使用过EF编写过Lambda表达式 2.基础类库 2.1该高级条件的类型 1 /// <summary> 2 /// 当前条件所属类型 3 /// </summary> 4 public enum Em_AS_ConditionType 5 { 6 /// <summary> 7 /// 并 8 /// </summary> 9 [Description("并")] 10

表达式树动态拼接lambda

动态拼接lambda表达式树 前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表达式树的参数,这样比如其中查询条件有一个是审核状态,另外五个是模糊查询,那这查询时的表达式树参数就要写两次,这样使得代码看起来有很多是重复的,而且如果查询条件多的情况下,在写那表达式树参数时也容易漏写或错写.所以我在想如果可以动态拼接这表达式树,那这代码就要精简很多了.

动态生成C# Lambda表达式

转载:http://www.educity.cn/develop/1407905.html,并整理! 对于C# Lambda的理解我们在之前的文章中已经讲述过了,那么作为Delegate的进化使用,为了让代码简洁和优雅的呈现,C# Lambda表达式的使用功不可灭,那么依托外部条件如何动态构建C# Lambda表达式呢.下面让我们来具体的看看实施. 或许你会奇怪这个需求是如何产生的…… 首先,Lambda 在 DLinq 中承担了以往 T-SQL 的部分角色:其次,在数据库设计中,我们往往需要依

SqlDataReader生成动态Lambda表达式

上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对SqlServer返回的流对象 SqlDataReader 进行处理,也采用动态生成Lambda表达式的方式转换实体. 先上一版代码 1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using Syst

Java 终于有 Lambda 表达式啦~Java 8 语言变化&mdash;&mdash;Lambda 表达式和接口类更改【转载】

原文地址 en cn 下载 Demo Java? 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件要少得多.接口更改使得接口可以添加到现有接口中,同时又不会破坏与现有代码的兼容性.本文将了解这些更改是如何协同工作的. Java 8 的最大变化在于添加了对 lambda 表达式 的支持.Lambda 表达式是可按引用传递的代码块.类似于一些其他编程语言中的闭包:它们是实现某项功能的代码,可接受一个