Lambda表达式树构建(上)

Posted 风浪子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(1, 1, 1, 1) + "");  //输出结果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表达式树构建(上)的主要内容,如果未能解决你的问题,请参考以下文章

基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源

如何构建具有多个条件的 Lambda 表达式树

如何从字符串为深层属性创建表达式树/lambda

Lambda表达式树解析(下)

构建动态表达式树以过滤集合属性

lambda查询