LINQ Expression tree节点
创始人
2024-06-06 15:41:46
0

在向大家详细介绍创建LINQ Expression tree节点之前,首先让大家了解下节点该如何创建,然后全面介绍。

创建LINQ Expression tree节点

当了解LINQ Expression tree的概念后,就可以来讨论一下这棵树里面的节点该如何创建。LINQ Expression tree节点一般是通过System.Linq.Expression.Expression这个类上的工厂方法来创建的。包括以下的一些方法:

  1. Add                : BinaryExpression    
  2. AddChecked         : BinaryExpression    
  3. And                : BinaryExpression    
  4. AndAlso            : BinaryExpression    
  5. ArrayIndex         : BinaryExpression    
  6. ArrayLength        : UnaryExpression    
  7. Call               : MethodCallExpression    
  8. Coalesce           : BinaryExpression    
  9. Condition          : ConditionalExpression    
  10. Constant           : ConstantExpression    
  11. Convert            : UnaryExpression    
  12. ConvertChecked     : UnaryExpression    
  13. Divide             : BinaryExpression    
  14. Equal              : BinaryExpression    
  15. ExclusiveOr        : BinaryExpression    
  16. Field              : MemberExpression    
  17. GreaterThan        : BinaryExpression    
  18. GreaterThanOrEqual : BinaryExpression    
  19. Invoke             : InvocationExpression    
  20. Lambda             : Expression    
  21. LeftShift          : BinaryExpression    
  22. LessThan           : BinaryExpression    
  23. LessThanOrEqual    : BinaryExpression    
  24. ListInit           : ListInitExpression    
  25. MakeBinary         : BinaryExpression    
  26. MakeMemberAccess   : MemberExpression    
  27. MakeUnary          : UnaryExpression    
  28. MemberInit         : MemberInitExpression    
  29. Modulo             : BinaryExpression    
  30. Multiply           : BinaryExpression    
  31. MultiplyChecked    : BinaryExpression    
  32. Negate             : UnaryExpression    
  33. NegateChecked      : UnaryExpression    
  34. New                : NewExpression    
  35. NewArrayBounds     : NewArrayExpression    
  36. NewArrayInit       : NewArrayExpression    
  37. Not                : UnaryExpression    
  38. NotEqual           : BinaryExpression    
  39. Or                 : BinaryExpression    
  40. OrElse             : BinaryExpression    
  41. Parameter          : ParameterExpression    
  42. Power              : BinaryExpression    
  43. Property           : MemberExpression    
  44. PropertyOrField    : MemberExpression    
  45. Quote              : UnaryExpression    
  46. RightShift         : BinaryExpression    
  47. Subtract           : BinaryExpression    
  48. SubtractChecked    : BinaryExpression    
  49. TypeAs             : UnaryExpression    
  50. TypeIs             : TypeBinaryExpression    
  51. UnaryPlus          : UnaryExpression  

上述列表中每个名字其实对应着一组重载,参数不同,但返回值的类型是一样的。这些工厂方法所生成的表达式的意义应该说还是很直观的,就不特别介绍了。经常跟编译器打交道的话应该对这些名字尤其熟悉。

这些工厂方法对应的类的层次结构是:

  1. System.Object  
  2. System.Linq.Expressions.Expression  
  3. System.Linq.Expressions.BinaryExpression  
  4. System.Linq.Expressions.ConditionalExpression  
  5. System.Linq.Expressions.ConstantExpression  
  6. System.Linq.Expressions.InvocationExpression  
  7. System.Linq.Expressions.LambdaExpression  
  8. System.Linq.Expressions.Expression 
  9. System.Linq.Expressions.MemberExpression  
  10. System.Linq.Expressions.MethodCallExpression  
  11. System.Linq.Expressions.NewExpression  
  12. System.Linq.Expressions.NewArrayExpression  
  13. System.Linq.Expressions.MemberInitExpression  
  14. System.Linq.Expressions.ListInitExpression  
  15. System.Linq.Expressions.ParameterExpression  
  16. System.Linq.Expressions.TypeBinaryExpression  
  17. System.Linq.Expressions.UnaryExpression 

观察可得知,LINQ Expression tree节点中的类只能用于表现表达式,而无法表现“更大”的语法结构,例如赋值表达式、一般语句等。这是LINQ v1的一个重要限制,也是为什么C# 3.0的规范里明确提到一个能赋值给Expressin类型的lambda表达式的方法体只能是一个表达式,而不能是一个代码块——代码块无法通过LINQ v1里的Expression tree表示。同时也值得注意的是,LINQ Expression tree本质上是一棵静态类型的树——所有节点所表示的类型都能够在编译时确定。

【编辑推荐】

  1. Linq结果集形状概述
  2. Linq存储过程返回详解
  3. Linq调用LoadProducts方法
  4. Linq使用数据表简单描述
  5. Linq对象引用简单介绍

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...