这里有两段代码:

看一下 Where 的参数

Linq To object 的 where 方法需要的参数是 委托

Linq To Sql的 where 方法需要的参数  是被 Expression 包裹的 委托

到这里 Lamada 表达式, 不一定是 匿名函数了,还有可能是数据结构

而且在 Lamada 表达式 作为 数据结构时 和作为匿名函数时是有区别的:

作为 数据结构的Lamada 表达式与普通表达式的区别   : 只有一行,不能有大括号 和 return

表达式目录树是可以转为委托的,  可以使用 Compile 方法    如下代码:

            // 这里的Lamada 表达式是一个数据结构// Lamada就像声明了多个变量以及变量之间的操作关系,需要的时候还可以解开Expression<Func<int, int, int>> exp = (x, y) => x * y + 2;  //正常//作为 数据结构的Lamada 表达式与普通表达式的区别   : 只有一行,不能有大括号 和 returnExpression<Func<int, int, int>> exp1 = (x, y) => { return x * y + 2; }; //报错//表达式目录树 转委托:exp.Compile().Invoke(78, 78);

其实 用   Lamada 表达式   声明 表达式目录树  是一种快捷方式 ,常规的声明如下:

最简版:2+5

  // 快捷Expression<Func<int>> exp2 = () => 2 + 544;// 常规ConstantExpression right = Expression.Constant(2); // 声明常量ConstantExpression left = Expression.Constant(544);// 声明常量BinaryExpression plus = Expression.Add(left, right);// 声明运算关系//构建表达式目录树   ,后面 的 ParameterExpression[] 为空表示参数为空Expression<Func<int>> express = Expression.Lambda<Func<int>>(plus,new ParameterExpression[]{ });

复杂一点:

以上面的快捷方式为目的拼接:

代码:

            Expression<Func<int, int, int>> exp = (x, y) => x * y +x+y+ 2;  //快捷方式//声明参数与常量var param1 = Expression.Parameter(typeof(int), "x");var param2 = Expression.Parameter(typeof(int), "y");var constant = Expression.Constant(2);//创造关系var multiply = Expression.Multiply(param1, param2);var plus = Expression.Multiply(multiply, param1);var plus1 = Expression.Multiply(plus, param2);var plus2 = Expression.Multiply(plus1, constant);//构建表达式目录树Expression<Func<int, int, int>> exp1 = Expression.Lambda<Func<int, int, int>>(plus2, new ParameterExpression[] { param1, param2 });//转换为委托并执行Console.WriteLine(exp1.Compile().Invoke(456, 123));Console.Read();

以上都是加减乘除的 表达式目录树  在 Linq To Sql 应用中经常是如下格式的或者更复杂:

上面的是目标 表达式目录树的 以下我们自己实现:

代码:

//普通声明ParameterExpression x = Expression.Parameter(typeof(Company), "x");ConstantExpression constant = Expression.Constant("3");PropertyInfo IdProp = typeof(Company).GetProperty("Id");//Id 属性Expression IdExp = Expression.Property(x, IdProp);  //获取x与Id的关系MethodInfo toString = typeof(int).GetMethod("ToString",new Type[] { }); //获取 ToString 方法Expression ToStringExp = Expression.Call(IdExp, toString);   //获取Id与 ToString   的关系MethodInfo equals = typeof(string).GetMethod("Equals",new Type[] { typeof(string) }); //获取EqualsExpression EqualsExp = Expression.Call(ToStringExp, equals, new Expression[] { constant }); //获取 string 与 Equals 的关系Expression<Func<Company, bool>> exp1 = Expression.Lambda<Func<Company, bool>>(EqualsExp, x);  //建立表达式目录树var res = exp1.Compile()(new Company() { Id = 5, Name = "王麻子" });//从表达式目录树中获取委托

我们自己手写 表达式目录树的目的是什么?这么累的玩意

为了实现动态

看一下远古拔版本的拼接条件:

到了 Linq To Sql 时代,再看看表达式目录树怎么拼接:这里的 exp 下面的会覆盖上面的,没有办法 做到 && 的结果,如果一一列举各种情况那会很累

还有第二种方案:这种方案会一直暴露 dbset 即 Company 表 很容易发生可怕的事,这是不知道怎么拼装,无奈的做法

所有我们需要让 表达式目录树 有 Or 和 And

And的初步实现:

//目标// Expression<Func<Company, bool>> exp = x => x.Name.Equals("Qal") && x.Id > 5;//声明参数与常量ParameterExpression x = Expression.Parameter(typeof(Company),"x");ConstantExpression constant = Expression.Constant("Qal");ConstantExpression int5 = Expression.Constant(5);//x.Name.Equals("Qal")PropertyInfo NameProp = typeof(Company).GetProperty("Name");var NameExp = Expression.Property(x, NameProp);MethodInfo equals = typeof(string).GetMethod("Equals");var equalsExp = Expression.Call(NameExp, equals, constant);//x.Id > 5;PropertyInfo IdProp = typeof(Company).GetProperty("Id");var IdExp = Expression.Property(x, IdProp);var GreaterThenExp = Expression.GreaterThan(IdExp,int5);var body = Expression.AndAlso(equalsExp, GreaterThenExp);// 拼接两个条件的表达式目录树// 构建表达式目录树Expression<Func<Company, bool>> exp1 = Expression.Lambda<Func<Company, bool>>(body, new ParameterExpression[] {x});exp1.Compile()(new Company() {Id =10,Name= "Qal" });

以上没有填完的坑待续....................

Expression 表达式目录树一相关推荐

  1. 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

    一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...

  2. C# Expression表达式目录树

    Expression就是表达式目录树,是以树形数据结构表示代码,其中每一个节点都是一种表达式. 用lambda表达式来创建一个简单的Expression 使用lambda表达式,编译器在生成IL时会帮 ...

  3. 第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法

    一. 简介 该章节,可以说是一个简单轻松的章节,只要你对Expression表达式树.EF的基本使用.泛型有所了解,那么本章节实质上就是一个非常简单的封装章节,便于我们快捷开发. PS:在该章节对于E ...

  4. delegate、Lambda表达式、Func委托和Expression(TDelegate)表达式目录树

    1.delegate MSDN:一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似.与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的.委托的类型由委托的名称定义 class ...

  5. 表达式目录树(Expression)

    表达式目录树 什么是表达式目录树呢?用于表示Lambda表达式逻辑的一种数据结构,表达式树也可以称作表达式目录树,它 将代码表示成一个对象树,而不是可执行的代码.这个跟汇编原理一样,我们找到关键字,把 ...

  6. C#表达式目录树系列之5 –动态创建查询表达式

    概要 在项目开发中,根据用户的需求,一般来是,我们的查询表达式是固定的,新的查询需求都要通过代码的修改来实现.而对于不确定的查询条件,固定查询表达式的方式显然是行不通的. 针对固定查询表达式存在的问题 ...

  7. C#表达式目录树系列之1 -- 表达式目录树基本概念

    概要 本文主要是帮助读者搞清楚什么是表达式目录树,表达书目录树能做什么,如何创建表达式目录树.后续几篇文章侧重于表达式目录树的具体应用. 表达式目录树是什么 表达式目录树是一种树型结构,它将代码以数据 ...

  8. 关于Expression表达式树的拼接

    关于Expression表达式树的拼接 最近在做项目中遇到一个问题,需求是这样的: 我要对已经存在的用户进行检索,可以根据用户的id 或者用户名其中的一部分字符来检索出来,这样就出现了三种情况 只有i ...

  9. 创建Expression表达式树动态查询

    EFCore 使用反射 根据实体的属性动态生成Expression进行查询 EFCore 的查询语法是: Expression<Func<T,bool>> condition ...

最新文章

  1. Linux中which命令作用,【每天一个Linux命令】12. Linux中which命令的用法
  2. 目标检测的图像特征提取
  3. Silverlight 2.0学习笔记——XAML
  4. Flink 在有赞的实践和应用
  5. 统计xml文件中的标签出现框数及出现过的图片数
  6. iOS底层探索之Runtime(三): lookUpImpOrForward慢速查找分析
  7. SharePoint 2013 Preview Single Server 评估环境安装与简单试用
  8. idea拉出Output窗口和还原窗口
  9. linux 查看网卡厂商,linux下查看网卡信息的命令
  10. 软件安全测试是为了什么,一航软件测评有这些见解
  11. 【时间之外】金融数据中心机房应对监管(最新出炉)
  12. 80386汇编_进入32位保护模式
  13. 四种快速简单添加视频字幕的方法,总有一款适合你
  14. 打印时候复选框勾选不见了_请取消勾选逐份打印复选框
  15. 故宫买票显示服务器开小差,比春运车票还难抢的故宫灯会 预约系统直接崩溃...
  16. 最短路小结(三种算法+各种常见变种)
  17. Word上的空白页无法删除,是因为在Word文档中有多种类型的格式标记,很多时候隐藏在页面中,无法看到这些标记,并占用文档区域,导致空白页无法直接删除。
  18. YOLOF训练自己的数据集(目标检测,cvpods版本)
  19. Keil4的下载程序后窗口闪退,程序保存失败
  20. vc读取北通手柄按键_噬血代码手柄怎么操作 噬血代码北通手柄按键功能详解-游侠网...

热门文章

  1. 网页学习——JavaScript事件
  2. JavaEE的学习第一部分
  3. 一文教你了解SSL协议
  4. 中国喷雾干燥血浆蛋白市场发展前景预测与发展规划研究报告2022-2028年
  5. 常见的Web攻击手段-整理
  6. caTools一个奇特的工具集
  7. 揭秘谷歌中国厨师团队:不创新会死
  8. Linux headless mode (无头模式)
  9. 视频教程-Appium移动自动化测试框架-软件测试
  10. Excel如何一键清除公式中的各种错误值?