概述

  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表达式树构建(上)的更多相关文章

  1. EntityFramework动态多条件查询与Lambda表达式树

              在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...

  2. 动态拼接lambda表达式树

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

  3. 将简单的lambda表达式树转为对应的sqlwhere条件

    1.Lambda的介绍 园中已经有很多关于lambda的介绍了.简单来讲就是vs编译器给我带来的语法糖,本质来讲还是匿名函数.在开发中,lambda给我们带来了很多的简便.关于lambda的演变过程可 ...

  4. Lambda表达式树解析(下)

    概述 前面章节,总结了Lambda树的构建,那么怎么解析Lambda表达式树那?Lambda表达式是一种委托构造而成,如果能够清晰的解析Lambda表达式树,那么就能够理解Lambda表达式要传递的正 ...

  5. Lambda表达式树解析(下)包含自定义的provider和查询

    概述 前面章节,总结了Lambda树的构建,那么怎么解析Lambda表达式树那?Lambda表达式是一种委托构造而成,如果能够清晰的解析Lambda表达式树,那么就能够理解Lambda表达式要传递的正 ...

  6. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  7. 用lambda表达式树替代反射

    本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作 ...

  8. C# Lambda表达式详解,及Lambda表达式树的创建

    最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...

  9. 定义通用的可通过lambda表达式树来获取属性信息

    我们一般获取某个类型或对象的属性信息均采用以下几种方法: 一.通过类型来获取属性信息 var p= typeof(People).GetProperty("Age");//获取指定 ...

随机推荐

  1. HTTP协议05-Web服务器

    1)用单台虚拟主机实现多个域名 HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点.比如,提供Web托管服务的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的 ...

  2. nginx proxy_set_header设置、自定义header

    先来看下proxy_set_header的语法 语法: proxy_set_header field value; 默认值: proxy_set_header Host $proxy_host; pr ...

  3. 关于PJ 10.27

    题1 : Orchestra 题意: 给你一个 n*m 的矩阵,其中有一些点是被标记过的. 现在让你求标记个数大于 k 个的二维区间个数. n.m .k 最大是 10 . 分析: part 1: 10 ...

  4. Power Network POJ - 1459 [网络流模板]

    http://poj.org/problem?id=1459 嗯,网络流模板...多源点多汇点的图,超级汇点连发电厂,用户连接超级汇点 Status Accepted Time 391ms Memor ...

  5. spring3.1 profile 配置不同的环境

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  6. 012_k8s专题系列一之进入容器日常op

    一.下面列出如何进入正在运行的k8s容器 <1> kubectl get pods #查看所有正在运行的pod NAME READY STATUS RESTARTS AGE nginx-5 ...

  7. 029_mac下nginx管理

    一. brew info nginx #查看nginx信息 nginx: stable 1.13.12 (bottled), HEAD Docroot is: /usr/local/var/www T ...

  8. 我理解的vue生命周期

    说些题外话,引出vue的生命周期. 比如人出生到寿终正寝,这是人的一个生命周期.他会经历出生,婴儿时期,童年时期,少年时期,青年,中年,老年,到 end.然后,每个时期都会有一定的历史任务在等着去完成 ...

  9. Docker入门 - 006 Docker 多种数据库的安装

    Docker 安装 MySQL 查找Docker Hub上的mysql镜像 root@VM_16_14_centos ~# docker search mysql INDEX NAME DESCRIP ...

  10. sql 迈安

    SELECT b.* FROM dbo.[耕地肥料_01土壤肥料机构建设基本情况]as b ,bs_org where--县(b.任务id in((select bs_task.id--,bs_org ...