如何创建 `ExpressionType.IsTrue/IsFalse`?
How to create `ExpressionType.IsTrue/IsFalse`?
TL;DR
如何创建 Expression
其中
Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse
背景信息
我正在创建 EnumerableQuery 的自定义版本,我在其中重写所有表达式以处理 Null 检查。因此,当将 EF Linq2Sql 代码作为 Linq2Objects 进行单元测试时,访问的 null
导航属性不会抛出异常,而是优雅地处理它。
我正在尝试为所有 ExpressionType
成员实施测试。如何创建表达式语法来创建 ExpressionType.IsTrue
和 ExpressionType.IsFalse
节点。
尝试 1.x => x
Where
子句:
queryable.Where(x => x.L1.L2.L3.L4.L5.Boolean);
returns
ExpressionType.MemberAccess
尝试 2.x => !(x && y)
以下 Where
子句:
queryable.Where(x => !(x.L1.L2.L3.L4.L5.Boolean && x.L1.L2.L3.L4.L5.Boolean));
returns
ExpressionType.Not
ExpressionType.AndAlso
Left = ExpressionType.MemberAccess
Right = ExpressionType.MemberAccess
尝试 3.x => 正确
Where
子句
queryable.Where(x => true);
returns
ExpressionType.Constant
评论
我猜这些 ExpressionType
仅在手动创建表达式树时使用,并且想要 return 类似于 ExpressionType.Constant(true)
但开销更少的表达式?
据我所知,ExpressionType.IsTrue
和 ExpressionType.IsFalse
分别代表一元运算符 true
and false
。它们不是常量布尔值的 "lower overhead" 替代品。
即是说,我还无法获得 "automatically" 创建这些节点之一的表达式。编译器将简单地发出对 op_true
的调用,它显示为 ExpressionType.Call
。所以看起来它在手动构建表达式树时真的出现了。实际上,您可以通过调用 Expression.IsTrue( Expression e )
.
创建此类型
TL;DR
如何创建 Expression
其中
Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse
背景信息
我正在创建 EnumerableQuery 的自定义版本,我在其中重写所有表达式以处理 Null 检查。因此,当将 EF Linq2Sql 代码作为 Linq2Objects 进行单元测试时,访问的 null
导航属性不会抛出异常,而是优雅地处理它。
我正在尝试为所有 ExpressionType
成员实施测试。如何创建表达式语法来创建 ExpressionType.IsTrue
和 ExpressionType.IsFalse
节点。
尝试 1.x => x
Where
子句:
queryable.Where(x => x.L1.L2.L3.L4.L5.Boolean);
returns
ExpressionType.MemberAccess
尝试 2.x => !(x && y)
以下 Where
子句:
queryable.Where(x => !(x.L1.L2.L3.L4.L5.Boolean && x.L1.L2.L3.L4.L5.Boolean));
returns
ExpressionType.Not
ExpressionType.AndAlso
Left = ExpressionType.MemberAccess
Right = ExpressionType.MemberAccess
尝试 3.x => 正确
Where
子句
queryable.Where(x => true);
returns
ExpressionType.Constant
评论
我猜这些 ExpressionType
仅在手动创建表达式树时使用,并且想要 return 类似于 ExpressionType.Constant(true)
但开销更少的表达式?
据我所知,ExpressionType.IsTrue
和 ExpressionType.IsFalse
分别代表一元运算符 true
and false
。它们不是常量布尔值的 "lower overhead" 替代品。
即是说,我还无法获得 "automatically" 创建这些节点之一的表达式。编译器将简单地发出对 op_true
的调用,它显示为 ExpressionType.Call
。所以看起来它在手动构建表达式树时真的出现了。实际上,您可以通过调用 Expression.IsTrue( Expression e )
.