表 达式树

》》》可以借助 LINQPad工具
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace EFDemo
{
    public class Product
    {
        public string Product_Name { get; set; }
        public int Product_Price { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Product> prolist = new List<Product>() {
                new Product(){ Product_Name="苹果手机",Product_Price=5999},
                new Product(){ Product_Name="华为手机",Product_Price=4999},
                new Product(){ Product_Name="华为手机",Product_Price=6999},
                new Product(){ Product_Name="苹果手机",Product_Price=9999}
            };
            var result1= prolist.Where(c =>{ return c.Product_Name == "苹果手机" && c.Product_Price > 6000; });
            foreach (var r in result1)
            {
                Console.WriteLine($"产品名称:{r.Product_Name} 价格:{r.Product_Price}");
            }
            var item=Expression.Parameter(typeof(Product), "item");
            var item_name = Expression.Property(item, "Product_Name");
            var item_price= Expression.Property(item, "Product_Price");
            var query_Name = Expression.Constant("苹果手机");
            var query_Price = Expression.Constant(6000);
            var c1 = Expression.Equal(item_name, query_Name);
            var c2 = Expression.GreaterThan(item_price, query_Price);
            var cc = Expression.And(c1, c2);
            var lambda_expression = Expression.Lambda<Func<Product, bool>>(cc, item);
            var reuslt = lambda_expression.Compile();
           
            Console.WriteLine(lambda_expression.ToString());
            var res = prolist.Where(reuslt);
            foreach (var r in res)
            {
                Console.WriteLine($"产品名称:{r.Product_Name} 价格:{r.Product_Price}");
            }
            Console.ReadKey();
        }
    }
}

在这里插入图片描述

》》》表达式树 编译之后 才是委托

利用表达式树 对象的映射

》》》定义一个泛型静态类 ExpressionMapper<Tin ,Tout>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace EFDemo
{
     public class ExpressionMapper<Tin ,Tout>
    {
        private static Func<Tin, Tout> _Func = null;
        static ExpressionMapper()
        {
            ParameterExpression paramExp = Expression.Parameter(typeof(Tin), "p");
            List<MemberBinding> memberBindingList = new List<MemberBinding>();
            //绑定属性
            foreach (var item in typeof(Tout).GetProperties())
            {
                MemberExpression member = Expression.Property(paramExp, typeof(Tin).GetProperty(item.Name));
                MemberBinding memberBinding = Expression.Bind(item,member);
                memberBindingList.Add(memberBinding);
            }
            //绑定字段
            foreach (var item in typeof(Tout).GetFields())
            {
                MemberExpression member = Expression.Field(paramExp, typeof(Tin).GetField(item.Name));
                MemberBinding memberBinding = Expression.Bind(item, member);
                memberBindingList.Add(memberBinding);
            }
            //创建新对象并初始化
            MemberInitExpression memberInitExp = Expression.MemberInit(Expression.New(typeof(Tout)),memberBindingList.ToArray());
            Expression<Func<Tin, Tout>> funcExp = Expression.Lambda<Func<Tin, Tout>>(memberInitExp, new ParameterExpression[] { paramExp });
            _Func = funcExp.Compile();
        }

        public static Tout Mapper(Tin t)
        {
            return _Func(t);
        }
    }
}

在这里插入图片描述

相关推荐

  1. 巧用lambda表达式构建各种“

    2024-06-14 11:18:02       40 阅读
  2. 动态表达式(Expression Tree)来实现动态筛选

    2024-06-14 11:18:02       56 阅读
  3. c#通过ExpressionTree 表达式实现对象关系映射

    2024-06-14 11:18:02       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 11:18:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 11:18:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 11:18:02       87 阅读
  4. Python语言-面向对象

    2024-06-14 11:18:02       96 阅读

热门阅读

  1. LeetCode236.二叉树最近的公共祖先

    2024-06-14 11:18:02       51 阅读
  2. 利用API推动业务创新

    2024-06-14 11:18:02       26 阅读
  3. 从位运算看海象运算符

    2024-06-14 11:18:02       35 阅读
  4. Docker:使用Docker自动化部署项目

    2024-06-14 11:18:02       24 阅读
  5. Tomcat

    Tomcat

    2024-06-14 11:18:02      28 阅读
  6. 云计算时代的等保测评挑战和应对策略

    2024-06-14 11:18:02       31 阅读
  7. vue设置点击自身以外其他区域关闭列表

    2024-06-14 11:18:02       27 阅读
  8. 查询ubuntu的ip方法

    2024-06-14 11:18:02       30 阅读