tnblog
首页
视频
资源
登录
愿你出走半生,归来仍是少年
排名
3
文章
317
粉丝
22
评论
14
bootstrap 栅格布局一小例子
剑轩 : 后端写样式有点痛苦哇
一点flex布局的运用
剑轩 : 后端写样式有点痛苦哇
vue.js常用指令
剑轩 : 可以可以,多总结一点
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

表达式树的解析

5534人阅读 2020/1/12 17:17 总访问:2062781 评论:0 收藏:0 手机
分类: NET

表达式树的作用

最常用到的无非就是ORM的删查改的条件,ORM就是在ado.Net的基础上封装了一层表达式,最后还是将表达式解析成sql,由ado.Net去执行。

那么我们能将表达式树解析成字符串,那么也能反过来。例如运费系统,在后台设置定义好一套计算规则。例如:对应不同的发货渠道,什么重量取哪个区间的费用,多于哪个阶段的费用还要额外费用。我们可以通过解析这套计算规则拼装好表达式树传入参数进行计算。。。

还有别的在评论补充下。。。

不扯多,现在我们只拿解析表达式树来学习。


创建表达式

  1. Expression<Func<Users, bool>> expressionUser = users => users.Name == "SkyChen"

从上图可以看见有很多属性,在表达式主体(属性Body),我们暂时只关注三个属性,Left(左节点)、Right(右节点)和 NodeType (当前节点类型)

简单解析

表达式主体(users.Name == "SkyChen")是一个二元运算表达式,因此可以将Body转换成 BinaryExpression 类型来访问Left和Right。


Left 和 Right 的 NodeType 分别为 MemberAccess(从字段或属性进行读取的运算)、Constant(常量)。


因此可以将 Left 转换成 MemberExpression 类型来访问 Member 属性,将 Right 转换成 ConstantExpression 类型来访问 Value 属性。具体代码如下:

  1. public static string ResolveExpression(Expression<Func<Users, bool>> expression)
  2.         {
  3.             var bodyNode = (BinaryExpression)expression.Body;
  4.             var leftNode = (MemberExpression)bodyNode.Left;
  5.             var rightNode = (ConstantExpression)bodyNode.Right;
  6.             return string.Format(" {0} {2} {1} ", leftNode.Member.Name, rightNode.Value, bodyNode.NodeType.TransferExpressionType());
  7.         }

TransferExpressionType 是针对部分 ExpressionType 的一个转换。

  1. public static string TransferExpressionType(this ExpressionType expressionType)
  2.         {            string type = "";            switch (expressionType)
  3.             {                case ExpressionType.Equal:
  4.                     type = "="break;                case ExpressionType.GreaterThanOrEqual:
  5.                     type = ">="break;                case ExpressionType.LessThanOrEqual:
  6.                     type = "<="break;                case ExpressionType.NotEqual:
  7.                     type = "!="break;                case ExpressionType.AndAlso:
  8.                     type = "And"break;                case ExpressionType.OrElse:
  9.                     type = "Or"break;
  10.             }            return type;
  11.         }

那么。一个最简单的表达式解析成where语句就完成了。

 


原文地址:

https://www.cnblogs.com/skychen1218/p/5730316.html




欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价