当前位置: 首页 > news >正文

表 达式树

在这里插入图片描述

》》》可以借助 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()){//   比如p.Product_IDMemberExpression member = Expression.Property(paramExp, typeof(Tin).GetProperty(item.Name)); //Product_ID = p.Product_ID 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);}//创建新对象并初始化 //new Good() {Product_ID= p.Product_ID, Product_Price= p.Product_Price}MemberInitExpression memberInitExp = Expression.MemberInit(Expression.New(typeof(Tout)),memberBindingList.ToArray());//p=>new Good() {Product_ID= p.Product_ID, Product_Price= p.Product_Price}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);}}
}

在这里插入图片描述
》》》 使用.netFramwork框架自带的AutoMapper,首先我们要nuget添加引用AutoMapper即可直接使用,具体代码为:

using AutoMapper;namespace ExpressionDemo.MappingExtend
{public class AutoMapperTest{public static TOut Trans<TIn, TOut>(TIn tIn){return Mapper.Instance.Map<TOut>(tIn);}}
}

》》》利用反射

/// <summary>/// 反射/// </summary>/// <typeparam name="TIn"></typeparam>/// <typeparam name="TOut"></typeparam>/// <param name="tIn"></param>/// <returns></returns>public static TOut Trans<TIn, TOut>(TIn tIn){TOut tOut = Activator.CreateInstance<TOut>();foreach (var itemOut in tOut.GetType().GetProperties()){var propIn = tIn.GetType().GetProperty(itemOut.Name);itemOut.SetValue(tOut, propIn.GetValue(tIn));}foreach (var itemOut in tOut.GetType().GetFields()){var fieldIn = tIn.GetType().GetField(itemOut.Name);itemOut.SetValue(tOut, fieldIn.GetValue(tIn));}return tOut;}

》》》 使用序列化和反序列化来完成对象属性映射:

/// <summary>/// 使用第三方序列化反序列化工具/// /// 还有automapper/// </summary>public class SerializeMapper{/// <summary>/// 序列化反序列化方式/// </summary>/// <typeparam name="TIn"></typeparam>/// <typeparam name="TOut"></typeparam>public static TOut Trans<TIn, TOut>(TIn tIn){return JsonConvert.DeserializeObject<TOut>(JsonConvert.SerializeObject(tIn));}}

》》》用lambda 生成 表达式

Lambda使用lambda表达声明表达式目录树的时候注意不能有{},即:

Expression<Func<int, int, int>> exp1 = (m, n) =>{return m * n + 2;};//不能有语句体   只能是一行,不能有大括号

在这里插入图片描述

  internal static class SqlOperator{internal static string ToSqlOperator(this ExpressionType type){switch (type){case (ExpressionType.AndAlso):case (ExpressionType.And):return "AND";case (ExpressionType.OrElse):case (ExpressionType.Or):return "OR";case (ExpressionType.Not):return "NOT";case (ExpressionType.NotEqual):return "<>";case ExpressionType.GreaterThan:return ">";case ExpressionType.GreaterThanOrEqual:return ">=";case ExpressionType.LessThan:return "<";case ExpressionType.LessThanOrEqual:return "<=";case (ExpressionType.Equal):return "=";case ExpressionType.Subtract:return "-";default:throw new Exception("不支持该方法");}}}public class CustomVisitor : ExpressionVisitor{private Stack<string> _StringStack = new Stack<string>();public string Condition(){string condition = string.Concat(this._StringStack.ToArray());this._StringStack.Clear();return condition;}/// <summary>/// 如果是二元表达式/// </summary>/// <param name="node"></param>/// <returns></returns>protected override Expression VisitBinary(BinaryExpression node){if (node == null) throw new ArgumentNullException("BinaryExpression");this._StringStack.Push(")");base.Visit(node.Right);//解析右边this._StringStack.Push(" " + node.NodeType.ToSqlOperator() + " ");base.Visit(node.Left);//解析左边this._StringStack.Push("(");return node;}/// <summary>/// /// </summary>/// <param name="node"></param>/// <returns></returns>protected override Expression VisitMember(MemberExpression node){if (node == null) throw new ArgumentNullException("MemberExpression");this._StringStack.Push(" [" + node.Member.Name + "] ");return node;}/// <summary>/// 常量表达式/// </summary>/// <param name="node"></param>/// <returns></returns>protected override Expression VisitConstant(ConstantExpression node){if (node == null) throw new ArgumentNullException("ConstantExpression");this._StringStack.Push(" '" + node.Value + "' ");return node;}/// <summary>/// 方法表达式/// </summary>/// <param name="m"></param>/// <returns></returns>protected override Expression VisitMethodCall(MethodCallExpression m){if (m == null) throw new ArgumentNullException("MethodCallExpression");string format;switch (m.Method.Name){case "StartsWith":format = "({0} LIKE {1}+'%')";break;case "Contains":format = "({0} LIKE '%'+{1}+'%')";break;case "EndsWith":format = "({0} LIKE '%'+{1})";break;default:throw new NotSupportedException(m.NodeType + " is not supported!");}this.Visit(m.Object);this.Visit(m.Arguments[0]);string right = this._StringStack.Pop();string left = this._StringStack.Pop();this._StringStack.Push(String.Format(format, left, right));return m;}}
 Expression<Func<People, bool>> lambda = x => x.Age > 5 && x.Name == "A" || x.Id > 5;CustomVisitor vistor = new CustomVisitor();vistor.Visit(lambda);Console.WriteLine(vistor.Condition());

相关文章:

  • 【NCBI】SRA toolkit安装及使用-WindowsLinux版本
  • 摄像头劫持——保护自己免受窥探
  • 【机器学习】机器学习重要方法—— 半监督学习:理论、算法与实践
  • 6.2 事件的创建,修改和删除
  • React native新架构组成
  • SQL server with方法修改
  • 两个src案例分享
  • SpringMVC框架学习笔记(八):自定义拦截器和异常处理
  • 第二十五篇——信息加密:韦小宝说谎的秘诀
  • R可视化:微生物相对丰度或富集热图可视化
  • RISC_CPU模块的调试
  • 开发一个python工具,pdf转图片,并且截成单个图片,然后修整没用的白边
  • MyBatis打印不带问号SQL
  • 电子书(chm)-加载JS--CS上线
  • 鸿蒙开发组件:【FA模型的Context】
  • “大数据应用场景”之隔壁老王(连载四)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • angular学习第一篇-----环境搭建
  • Apache Pulsar 2.1 重磅发布
  • crontab执行失败的多种原因
  • CSS 三角实现
  • vue的全局变量和全局拦截请求器
  • Vue官网教程学习过程中值得记录的一些事情
  • 搞机器学习要哪些技能
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 类orAPI - 收藏集 - 掘金
  • 排序算法学习笔记
  • 前端相关框架总和
  • 使用 QuickBI 搭建酷炫可视化分析
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微服务入门【系列视频课程】
  • 与 ConTeXt MkIV 官方文档的接驳
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #LLM入门|Prompt#3.3_存储_Memory
  • #知识分享#笔记#学习方法
  • (pytorch进阶之路)扩散概率模型
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (九)One-Wire总线-DS18B20
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (南京观海微电子)——示波器使用介绍
  • (十五)使用Nexus创建Maven私服
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Family_物联网
  • .gitignore文件设置了忽略但不生效
  • .NET C# 使用 iText 生成PDF
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET/C# 使用反射注册事件
  • .NetCore发布到IIS
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .net专家(张羿专栏)
  • ;号自动换行
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @Slf4j idea标红Cannot resolve symbol ‘log‘