LINQ Expression tree节点

开发 后端
这里介绍LINQ Expression tree节点一般是通过System.Linq.Expression.Expression这个类上的工厂方法来创建的。

在向大家详细介绍创建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<TDelegate>    
  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<TDelegate> 
  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<TDelegate>类型的lambda表达式的方法体只能是一个表达式,而不能是一个代码块——代码块无法通过LINQ v1里的Expression tree表示。同时也值得注意的是,LINQ Expression tree本质上是一棵静态类型的树——所有节点所表示的类型都能够在编译时确定。

【编辑推荐】

  1. Linq结果集形状概述
  2. Linq存储过程返回详解
  3. Linq调用LoadProducts方法
  4. Linq使用数据表简单描述
  5. Linq对象引用简单介绍
责任编辑:佚名 来源: IT168
相关推荐

2009-09-09 17:02:05

LINQ Expres

2009-09-14 15:45:28

LINQ删除XML节点

2009-09-15 10:16:01

LINQ动态查询

2009-09-17 13:54:26

LINQ to XML

2009-09-17 13:30:32

LINQ to XML

2010-09-03 12:46:28

CSSexpression

2013-08-27 10:20:35

JavaLINQLinq4j

2009-09-15 16:31:15

LINQ Custom

2009-09-09 15:37:27

Linq DataLo

2009-09-15 14:30:11

Linq连接

2009-09-10 13:42:47

Linq UserIn

2009-09-09 15:44:22

Linq DataCo

2009-09-10 11:10:21

Linq Librar

2009-07-14 11:03:07

Expression SketchFlowSilverlight

2009-09-14 13:44:14

Lambda ExprC# Lambda

2010-09-07 16:46:59

CSSexpression

2012-04-28 14:31:51

Expression

2009-09-14 14:25:53

C# Lambda EC# Lambda

2009-09-18 16:41:46

Linq to sql

2009-09-10 10:37:15

LINQ to SQL
点赞
收藏

51CTO技术栈公众号