动态创建 Lambda 表达式
首先我们看一个简单 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 表达式的更多相关文章
- 动态创建Lambda表达式实现高级查询
需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...
- C#动态创建lambda表达式
/// <summary> /// 创建lambda表达式:p=>true /// </summary> /// <typeparam name="T&q ...
- 使用Expression动态创建lambda表达式
using System;using System.Linq.Expressions;using System.Reflection; namespace Helper{ public class L ...
- 动态组合lambda 表达式
//记录实体集合—动态组合lambda 表达式 Expression<Func<AdEntity, bool>> thirdWhere = p => p.Observer ...
- easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展
EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...
- 【转】EntityFramework动态组合Lambda表达式作为数据筛选条件,代替拼接SQL语句
传统的操作数据库方式,筛选数据需要用StringBuilder拼接一大堆的WHERE子句. 在Entity Framework中,代码稍有不慎就会造成巨大性能消耗,如: using(var db=ne ...
- 动态拼接lambda表达式树
前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...
- [2014-12-30]如何动态构造Lambda表达式(动态构造Lambda查询条件表达式)
声明 本文对Lambda表达式的扩展,示例代码来源于网络. 场景描述 web开发查询功能的时候,如果查询条件比较多,就会遇到动态组合查询条件的情况.在手写sql的情况下,我们一般会根据传入的参数,针对 ...
- 动态构建Lambda表达式实现EF动态查询
在使用Entity Framework做数据查询的时候,查询条件往往不是固定的,需要动态查询.可以通过动态构建Lamda表达式来实现动态查询. Lamda表达式 使用Lamda表达式可以很方便的按条件 ...
随机推荐
- web前端基础知识-(六)jQuery-补
一.JS正则 1.定义正则表达式 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串: 1)构造函数 var reg=new RegExp('< ...
- Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor
结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...
- Python Day20
Django 表操作 1.基本操作 # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # o ...
- Windows无法完成安装,若要在此计算机上安装Windows,请中心启动安装。
现在安装系统已经很简单了,我觉得U盘启动的话两步就差不多了, 壹:设置BIOS,将U盘启动作为系统默认启动选项 贰:直接进去大白菜之类的,一键安装... 今天终于看到第三部了, 报错:Windows无 ...
- Android之ListView性能优化——使用ConvertView和ViewHolder
使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...
- SQL Server性能计数器收集汇总方案(Reporting Service)
通过收集计数器信息,并将计数器信息汇总为不同粒度存储,以Reporting Service报表服务器显示.以下是计数器收集汇总的基本架构. 笔者需要收集的SQL Server计数器包括:SQL Ser ...
- 手机通过数据线连接电脑后,找不到设备--Android Studio
手机通过数据线连接电脑后,找不到可用的设备.允许USB调试,,因为小米手机还要设置USB开发者模式. 1.打开设置/关于手机 四次点击“MIUI版本”如图: 2.返回上一页打开更多设置 看到开发者选项 ...
- 一些LINQ的使用
var list = from staff in staffList from extraRecord in extraList where staff.staffID == extraRecord. ...
- FFmpeg和X264的交叉编译环境
在下载好了FFmpeg和X264的源码包之后,在Linux下进行安装的基本流程就是切换到其源码的根目录,然后以此执行以下命令.基本上所有的开源源码包的默认编译安装都是这三步. ./configure ...
- Autoit中用PrintWindow替代ScreenCapture函数实现截图
想截取躲在后面的窗体或控件,找到了PrintWindow函数,幸运的是Autoit3也对此进行了封装以方便使用. 于是乎,将帮助文件里的_WinAPI_PrintWindow()实例改写了一下,以替代 ...