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

i => i > 5

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

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

例子1

var ints = new int[] { , , , , , , , ,  };
//var r = ints.Where(i => i > 5); // 要实现的表达式 // 创建参数 i
var parameter = Expression.Parameter(typeof(int), "i"); // 创建常量5
var constant = Expression.Constant(); // 创建比较表达式 i > 5
var bin = Expression.GreaterThan(parameter, constant); // 获取Lambda表达式
var lambda = Expression.Lambda<Func<int, bool>>(bin, parameter); // 通过 Compile 方法获取 Delegate
var _r = ints.Where(lambda.Compile());

例子2

var ints = new int[] { , , , , , , , ,  };
// var r = ints.Where(i => i > 5 && i <= 7); // 要实现的表达式 // 创建参数 i
var parameter = Expression.Parameter(typeof(int), "i"); // 创建表达式 i > 5
var con1 = Expression.Constant();
var bin1 = Expression.GreaterThan(parameter, con1); // 创建表达式 i <= 7
var con2 = Expression.Constant();
var bin2 = Expression.LessThanOrEqual(parameter, con2); // 组合两个表达式
var body = Expression.And(bin1, bin2); // 获取 Lambda 表达式
var lambda = Expression.Lambda<Func<int, bool>>(body, parameter); var _r = ints.Where(lambda.Compile());

在例子2中,我们对复杂的表达式进行了分解,并使用 And 完成多个表达式的组装,由此我们可以创建更加复杂的逻辑组合,比如例子3。

例子3

var ints = new int[] { , , , , , , , ,  };
// var r = ints.Where(i => (i > 5 && i <= 7) || (i == 3)); // 要实现的表达式 // 创建参数 i
var parameter = Expression.Parameter(typeof(int), "i"); // 创建表达式 i > 5
var con1 = Expression.Constant();
var bin1 = Expression.GreaterThan(parameter, con1); // 创建表达式 i < 7
var con2 = Expression.Constant();
var bin2 = Expression.LessThanOrEqual(parameter, con2); // 创建表达式 i == 3
var con3 = Expression.Constant();
var bin3 = Expression.Equal(parameter, con3); // 组合 i > 5 && i <= 7
var body = Expression.And(bin1, bin2); // 组合 ( i > 5 && i <= 7) OR (i == 3)
body = Expression.Or(body, bin3); var lambda = Expression.Lambda<Func<int, bool>>(body, parameter);
var _r = ints.Where(lambda.Compile());

例子4

var ints = new int[] { , , , , , , , ,  };
//var r = ints.Select(i => i % 2 == 0 ? i : 0); // 要实现的表达式 // 创建参数 i
var parameter = Expression.Parameter(typeof(int), "i"); // 创建表达式 i % 2
var con1 = Expression.Constant();
var bin1 = Expression.Modulo(parameter, con1); // 创建表达式 (i % 2) == 0
var con2 = Expression.Constant();
var bin2 = Expression.Equal(bin1, con2); // 创建表达式 IIF(((i % 2) = 0), i, 0)
var bin3 = Expression.Condition(bin2, parameter, Expression.Constant()); var lambda = Expression.Lambda<Func<int, int>>(bin3, parameter);
var _r = ints.Select(lambda.Compile());

例子5

var ints = new int[] { , , , , , , , ,  };
// Array.ForEach<int>(ints, 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);
Array.ForEach<int>(ints, lambda.Compile());

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

  1. 动态创建Lambda表达式实现高级查询

    需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...

  2. C#动态创建lambda表达式

    /// <summary> /// 创建lambda表达式:p=>true /// </summary> /// <typeparam name="T&q ...

  3. 使用Expression动态创建lambda表达式

    using System;using System.Linq.Expressions;using System.Reflection; namespace Helper{ public class L ...

  4. 动态组合lambda 表达式

    //记录实体集合—动态组合lambda 表达式 Expression<Func<AdEntity, bool>> thirdWhere = p => p.Observer ...

  5. easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展

    EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...

  6. 【转】EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句

    传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...

  7. 动态拼接lambda表达式树

    前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...

  8. [2014-12-30]如何动态构造Lambda表达式(动态构造Lambda查询条件表达式)

    声明 本文对Lambda表达式的扩展,示例代码来源于网络. 场景描述 web开发查询功能的时候,如果查询条件比较多,就会遇到动态组合查询条件的情况.在手写sql的情况下,我们一般会根据传入的参数,针对 ...

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

    在使用Entity Framework做数据查询的时候,查询条件往往不是固定的,需要动态查询.可以通过动态构建Lamda表达式来实现动态查询. Lamda表达式 使用Lamda表达式可以很方便的按条件 ...

随机推荐

  1. Jenkins 安装FAQ

    1.对路径的访问被拒绝,如: 解决办法:以管理员模式进入DOS命令窗口,参考Jenkins安装中的第4步: 2.服务不能启动,提示:   解决办法:启动Windows Service(InstallU ...

  2. MySQL存储引擎--MyISAM与InnoDB区别

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISA ...

  3. PHP数组函数总结

    array_change_key_case - 返回字符串键名全为小写或大写的数组 array_chunk - 将一个数组分割成多个 array_column - 返回数组中指定的一列 array_c ...

  4. 高性能异步图片加载器的JS库:lazysizes

    <script src="lazysizes.min.js" async=""></script> 使用示例 <!-- non-r ...

  5. ss命令和Recv-Q和Send-Q状态

    ss 用来显示处于活动状态的套接字信息.ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比nets ...

  6. Oracle操作

    1.查询表空间地址: select name from v$datafile; 2.创建表空间: create tablespace yysspace datafile ‘D:\APP\MIAO\OR ...

  7. WPF这样的界面应该如何编写呢?

    如上图: 外围是一个Border,内部填充一个Grid,Grid分成两行,第一行有一个按钮可以进行操作(主要是操作ListBox的数据源:增加和删除对象),第二行填充一个ListBox,绑定数据源并根 ...

  8. D3.js学习(一)

    从今天开始我将和大家一起学习D3.js(Data-Driven Documents),由于国内关于D3的学习资料少之又少,所以我觉得很有必要把自己学习过程记录下来,供同学们参考,如果文章有有哪些表达有 ...

  9. 转载:Centos7 从零编译配置Memcached

    序言 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. Memca ...

  10. jquery_DOM笔记3

    css 操作: css()设置或者返回匹配元素的样式 height() 设置或者返回匹配元素的高度 width() 设置或者返回匹配元素的宽度 offset()设置或者返回匹配元素相对于文档的相对位置 ...