如何创建“ExpressionType.IsTrue/IsFalse”?

Mic*_*han 5 .net c# expression compilation linq-expressions

长话短说

如何创建一个Expression地点

Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse
Run Code Online (Sandbox Code Playgroud)

背景信息

我正在创建 EnumerableQuery 的自定义版本,在其中重写所有表达式以处理 Null 检查。因此,当将 EF Linq2Sql 代码作为 Linq2Objects 进行单元测试时,访问的null导航属性不会引发异常,而是优雅地处理它。

我正在尝试对所有成员进行测试ExpressionType。如何创建表达式语法来创建ExpressionType.IsTrueExpressionType.IsFalse节点。

Github 项目:Moqqer

尝试 1.x => x

Where条款:

queryable.Where(x => x.L1.L2.L3.L4.L5.Boolean);
Run Code Online (Sandbox Code Playgroud)

回报

ExpressionType.MemberAccess
Run Code Online (Sandbox Code Playgroud)

尝试 2. x => !(x && y)

以下Where条款:

queryable.Where(x => !(x.L1.L2.L3.L4.L5.Boolean && x.L1.L2.L3.L4.L5.Boolean));
Run Code Online (Sandbox Code Playgroud)

回报

ExpressionType.Not
     ExpressionType.AndAlso
         Left = ExpressionType.MemberAccess
         Right = ExpressionType.MemberAccess
Run Code Online (Sandbox Code Playgroud)

尝试 3.x => true

Where条款

queryable.Where(x => true);
Run Code Online (Sandbox Code Playgroud)

回报

ExpressionType.Constant
Run Code Online (Sandbox Code Playgroud)

评论

我猜测这些ExpressionType仅在手动创建表达式树时使用,并且想要返回类似于ExpressionType.Constant(true)但开销更少的表达式?

Kyl*_*yle 4

据我所知,ExpressionType.IsTrue和分别ExpressionType.IsFalse代表一元运算符truefalse。它们不是常量布尔值的“低开销”替代品。

也就是说,我无法获得一个表达式来“自动”创建这些节点之一。编译器将简单地发出一个调用,op_true该调用显示为ExpressionType.Call. 所以看起来它在手动构建表达式树时确实出现了。事实上,您可以通过调用来创建此类型Expression.IsTrue( Expression e )