Lambda表达式树构建(上)
概述
Lambda是C#常用的语句,采用委托等方式,来封装真实的代码块。Lambda其实就是语法糖,是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。常用的方法有Where、Select、SelectMany、Aggregate等;语法结构SomeList.Where(p=>p.property==value),其中SomeList基础IEnumerable或IQueryable接口;这里主要记录下自定义Lambda表达式的构建;
Lambda表达式树
针对Lambda表达式SomeList.Where(p=>p.property==value),我们都知道采用了委托的方式,获取数据集合。p=>p.property==value是一个委托Fun<Object,bool>的封装。那么如何采用代码的方式来构建这样的表达式那?常用的表达式类有:

通过使用这些Expression来完成表达式的构建,下面是组构建表达式i*j+w*x的代码:
//i*j+w*x
ParameterExpression a = Expression.Parameter(typeof(int),"i"); //创建一个表达式树中的参数,作为一个节点,这里是最下层的节点
ParameterExpression b = Expression.Parameter(typeof(int),"j");
BinaryExpression r1 = Expression.Multiply(a,b); //这里i*j,生成表达式树中的一个节点,比上面节点高一级 ParameterExpression c = Expression.Parameter(typeof(int), "w");
ParameterExpression d = Expression.Parameter(typeof(int), "x");
BinaryExpression r2 = Expression.Multiply(c, d); BinaryExpression result = Expression.Add(r1,r2); //运算两个中级节点,产生终结点 Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(result,a,b,c,d); Console.WriteLine(lambda + ""); //输出‘(i,j,w,x)=>((i*j)+(w*x))’,z对应参数b,p对应参数a Func<int, int, int, int, int> f= lambda.Compile(); //将表达式树描述的lambda表达式,编译为可执行代码,并生成该lambda表达式的委托; Console.WriteLine(f(, , , ) + ""); //输出结果2
我们也可以封装对象表达式 (P=>P.Title=="水浒传")
Catagory cag = new Catagory("四大名著点评");
IList<Blog> Blogs = new List<Blog>();
Blog bok = new Blog() { Title = "红楼梦", Conent = "红楼梦书籍不错", User = new Author() { UserName = "曹雪芹", BirefInfor = "中国清代著名作家" } };
bok.Catagories.Add(cag);
bok.Catagories.Add(new Catagory("红楼梦专栏"));
Blogs.Add(bok);
Blog bok2 = new Blog() { Title = "三国演义", Conent = "三国鼎立时期的描述",
User = new Author() { UserName = "罗贯中", BirefInfor = "中国元末明初著名作家" } };
bok2.Catagories.Add(cag);
bok2.Catagories.Add(new Catagory("三国演义专栏"));
Blogs.Add(bok2);
Blog bok3 = new Blog() { Title = "西游记", Conent = "西游记讲述四个徒弟和一个师傅取经事情",
User = new Author() { UserName = "吴承恩", BirefInfor = "中国明代杰出的小说家" } };
bok2.Catagories.Add(cag);
bok2.Catagories.Add(new Catagory("西游记专栏"));
Blogs.Add(bok3);
Blog bok4 = new Blog() { Title = "水浒传", Conent = "描述梁山好汉劫富济贫的故事",
User = new Author() { UserName = "施耐庵", BirefInfor = "中国明代杰出的小说家" } };
bok2.Catagories.Add(cag);
bok2.Catagories.Add(new Catagory("水浒传专栏"));
Blogs.Add(bok4);
ParameterExpression pri = Expression.Parameter(typeof(Blog),"p");
MemberExpression mp = Expression.Property(pri, "Title");
ConstantExpression CE = Expression.Constant("水浒传");
BinaryExpression Prat = Expression.Equal(pri, CE);
var result = Expression.Lambda<Func<Blog, bool>>(Prat, pri).Compile();
var ResultCom=Blogs.Where(result).First();
Lambda表达式树,就这样构建了,但是怎么去解析Lambda表达式树那?
Lambda表达式树构建(上)的更多相关文章
- EntityFramework动态多条件查询与Lambda表达式树
在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...
- 动态拼接lambda表达式树
前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...
- 将简单的lambda表达式树转为对应的sqlwhere条件
1.Lambda的介绍 园中已经有很多关于lambda的介绍了.简单来讲就是vs编译器给我带来的语法糖,本质来讲还是匿名函数.在开发中,lambda给我们带来了很多的简便.关于lambda的演变过程可 ...
- Lambda表达式树解析(下)
概述 前面章节,总结了Lambda树的构建,那么怎么解析Lambda表达式树那?Lambda表达式是一种委托构造而成,如果能够清晰的解析Lambda表达式树,那么就能够理解Lambda表达式要传递的正 ...
- Lambda表达式树解析(下)包含自定义的provider和查询
概述 前面章节,总结了Lambda树的构建,那么怎么解析Lambda表达式树那?Lambda表达式是一种委托构造而成,如果能够清晰的解析Lambda表达式树,那么就能够理解Lambda表达式要传递的正 ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- 用lambda表达式树替代反射
本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作 ...
- C# Lambda表达式详解,及Lambda表达式树的创建
最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...
- 定义通用的可通过lambda表达式树来获取属性信息
我们一般获取某个类型或对象的属性信息均采用以下几种方法: 一.通过类型来获取属性信息 var p= typeof(People).GetProperty("Age");//获取指定 ...
随机推荐
- requests库入门13-会话对象
会话对象可以在跨请求保持某些参数,会话对象有requests api的大部分方法,我理解会话对象就是一个资源共享池 使用requests.Session()可以创建会话对象的实例 还是以之前GitHu ...
- hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存
QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...
- HDU - 2665 Kth number 主席树/可持久化权值线段树
题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
- 003_crlf注入漏洞
一. (1) 线上收到一个crlf 注入的漏洞. 同时启用80和443才会暴露,配置如下: server { listen 80; listen 443 ssl; server_name www.jy ...
- Mysql 通过frm&ibd 恢复数据
mysql存储在磁盘中,各种天灾人祸都会导致数据丢失.大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做好所有数据备份需要支出大量的成本,很多公司也是不现实的.万一还没有做好备份,数据被误删除 ...
- C++ DLL
DLL(Dynamic Link Library)(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用.譬如Windows提供的 ...
- Mysql 一些基本的小东西
mysql的安装 1.解压目录 2.添加环境变量 系统的环境变量 3.初始化 mysqld --initialize-insecure 4.启动服务端 mysqld 直接启动 这个时候 吼住 5.连接 ...
- jqgrid获取数据条数
function getResult() {//获取结果结合的函数,可以通过此函数获取查询后匹配的所有数据行. var o = jQuery("#jqgrid"); ...
- JavaScript 输入小数点(event.key或event.code)
1. 概述 1.1 说明 在开发过程中,有时候需要仅输入数字与小数,故记录下使用过的功能,以便后期使用. 1.2 key 定义:按下按键时返回的标识符,按键标识符是表示键盘按钮的字符串(如1,2,a等 ...
- Go语言环境安装&搭建(Win)
Go语言简介 什么是Go语言 Go语言是谷歌2009发布的第二款开源编程语言. Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全.支持 ...