我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#表达式树Expression怎么创建

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#表达式树Expression怎么创建

本篇内容介绍了“C#表达式树Expression怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

什么是表达式树

表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等。可以对表达式树中的代码进行编辑和运算。 这样能够动态修改可执行代码、在不同数据库中执行 LINQ 查询以及创建动态查询。 表达式树还能用于动态语言运行时 (DLR) 以提供动态语言和 .NET 之间的互操作性,同时保证编译器编写员能够发射表达式树而非 Microsoft 中间语言 (MSIL)。 这段话是来自官网( [表达式树 (C#) | Microsoft Docs](表达式树 (C#) | Microsoft Docs) )的定义。

在 C# 中,我们可以通过 Expression 的方式来手动创建表达式树,比如:

[HttpGet]public IActionResult Expression(){    // 查询 年龄Age 大于 18 的元素    Expression<Func<User,bool>> expression1 = x => x.Age > 18;     return Ok();}

那么,x.Age > 18 这一表达式,它的树状结构是这样的:

C#表达式树Expression怎么创建

通过 Visual Studio 自带的查看变量或添加监视的方式,我们可以发现其中 树的根节点(NodeType)是 GreaterThan,左节点(Left)是 x.Age,右节点(Right)是 18。所以由此就可以大概画出树状结构。

C#表达式树Expression怎么创建

最后,通过这种树状结构,C# 就可以帮我们将表达式编译成具体的 SQL 执行语句。

如果想更清晰的查看表达式树的结构,可以 nuget 一个包( ExpressionTreeToString ),将表达式结构转换成字符串

PM> Install-Package ZSpitz.Util -Version 0.1.116
Expression<Func<User, bool>> expression = u => u.Age >= 18;var treeStr = expression.ToString("Object notation", "C#");// 输出为下面字符串var u = new ParameterExpression {    Type = typeof(User),    IsByRef = false,    Name = "u"};new Expression<Func<User, bool>> {    NodeType = ExpressionType.Lambda,    Type = typeof(Func<User, bool>),    Parameters = new ReadOnlyCollection<ParameterExpression> {        u    },    Body = new BinaryExpression {        NodeType = ExpressionType.GreaterThanOrEqual,        Type = typeof(bool),        Left = new MemberExpression {            Type = typeof(int),            Expression = u,            Member = typeof(User).GetProperty("Age")        },        Right = new ConstantExpression {            Type = typeof(int),            Value = 18        }    },    ReturnType = typeof(bool)}

Expression 和 Func 的区别

  • Expression 存储了运算逻辑,可以将其保存成抽象语法树(AST),可以在运行时动态获取运算逻辑。

  • Func 只是存储了结果,无法保存成语法树,也无法动态获取运算逻辑。

所以,在 EFCore 中,使用表达式对数据库数据进行查询中,我们应该选择 Expression 而不是 Func,因为使用了 Func ,实际上并无法将 Func 中的表达式转换成 SQL,而是在将所有数据加载到内存后,在内存中在过滤 Func 中的条件。

简单来说就是,此时要筛选 User 表中年龄大于18的数据,可以有这两种写法

// 这种写法,实际生成的 SQL 语句, 大概是这样的 SELECT * FROM User as T WHERE T.age > 18Expression<Func<User,bool>> expression1 = x => x.Age > 18;dbContext.User.Where(expression1).toList();// 而这种, 生成的语句是这样的 SELECT * FROM User, 然后将 User 表中所有数据加载到内存中后, 在进行 age > 18 的过滤Func<User, bool> func1 = x => x.Age > 18;dbContext.User.Where(func1).toList();

通过代码创建表达式树

  • ParameterExpression

  • BinaryExpression

  • MethodCallExpression

  • ConstantExpression

这些类几乎都没有提供构造方法,而且所有的属性都几乎只是只读。因此我们一般不会直接创建这些类的实例,而是调用 Expression 类的 Parameter、MakeBinary、Call、Constant等静态方法来生成,这些静态方法我们一般称作创建表达式树的工厂方法,而属性则通过方法参数类设置。

动态将表达式:u => u.Age >= 18; 通过代码构建出来

一般构建步骤:

  • 先创建 ParameterExpression

  • 接着由里到外逐步构建

    • 先左节点(Left)

    • 后右节点(Right)

    • 接着Body节点

  • 将其拼接成 Expression

public IActionResult GetUserByManualExpression(){    ParameterExpression parameterExpression = Expression.Parameter(type:typeof(User), name: "u");    ConstantExpression right = Expression.Constant(18);    MemberExpression left = Expression.MakeMemberAccess(parameterExpression, member: typeof(User).GetProperty("Age"));    BinaryExpression body = Expression.GreaterThanOrEqual(left, right);    Expression<Func<User, bool>> expression = Expression.Lambda<Func<User, bool>>(body, parameters: parameterExpression);    var data = _userService.GetUsers(expression);    return Ok(new    {        code = 200,        msg = "OK",        data    });}

“C#表达式树Expression怎么创建”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#表达式树Expression怎么创建

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#表达式树Expression怎么创建

本篇内容介绍了“C#表达式树Expression怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是表达式树表达式树以树形数据结构表
2023-06-22

怎么用C#表达式树Expression动态创建表达式

本篇内容介绍了“怎么用C#表达式树Expression动态创建表达式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在一些管理后台中,对数据进
2023-06-22

如何在C#项目中创建一个Lambda表达式和Lambda表达式树

如何在C#项目中创建一个Lambda表达式和Lambda表达式树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、表达式Lambda  表达式位于 => 运算符右侧的 la
2023-06-06

C#怎么动态创建lambda表达式

这篇文章主要讲解了“C#怎么动态创建lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么动态创建lambda表达式”吧!C#动态创建lambda表达式代码如下:
2023-07-05

C# Lambda表达式树怎么实现

这篇文章主要介绍“C# Lambda表达式树怎么实现”,在日常操作中,相信很多人在C# Lambda表达式树怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C# Lambda表达式树怎么实现”的疑惑有所
2023-06-17

C#值类型、引用类型、泛型、集合的表达式树怎么创建

这篇文章主要介绍了C#值类型、引用类型、泛型、集合的表达式树怎么创建的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#值类型、引用类型、泛型、集合的表达式树怎么创建文章都会有所收获,下面我们一起来看看吧。一,定
2023-06-26

JavaScript正则表达式怎么创建

本篇内容介绍了“JavaScript正则表达式怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.JavaScript正则表达式的作用
2023-06-26

C#如何动态创建lambda表达式

这篇文章主要介绍了C#如何动态创建lambda表达式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-26

ASP.NET表达式树怎么构建DomainRoute的URL域名

本篇内容主要讲解“ASP.NET表达式树怎么构建DomainRoute的URL域名”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET表达式树怎么构建DomainRoute的URL域名”
2023-06-17

C#使用表达式树怎么实现对象复制

本篇内容主要讲解“C#使用表达式树怎么实现对象复制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#使用表达式树怎么实现对象复制”吧!需求背景:对象复制性能优化;同时,在对象复制时,应跳过引用类
2023-06-22

VBS中怎么创建正则表达式对象

VBS中怎么创建正则表达式对象,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一直以来,我都是用 New RegExp 来创建正则表达式对象的: Set regex = New
2023-06-08

C# Lambda表达式怎么用

这篇文章主要为大家展示了“C# Lambda表达式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C# Lambda表达式怎么用”这篇文章吧。C#语言还是比较常见的东西,这里我们主要介绍C#
2023-06-17

C++中怎么将中缀表达式转换为后缀表达式

本篇文章为大家展示了C++中怎么将中缀表达式转换为后缀表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可1.用字符数组存储整行输入
2023-06-05

C++怎么使用正则表达式

今天小编给大家分享一下C++怎么使用正则表达式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。目正则表达式正则表达式(regu
2023-06-30

C#正则表达式怎么理解

这篇文章主要讲解了“C#正则表达式怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#正则表达式怎么理解”吧!到目前为止,许多的编程语言和工具都包含对正则表达式的支持,当然.NET也不
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录