C# 如何创建“ExpressionType.IsTrue/IsFalse”? TL;博士

C# 如何创建“ExpressionType.IsTrue/IsFalse”? TL;博士,c#,.net,compilation,expression,linq-expressions,C#,.net,Compilation,Expression,Linq Expressions,如何创建表达式where Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse 背景信息 我正在创建EnumerableQuery的自定义版本,其中我重写了所有表达式以处理空检查。因此,当将EF Linq2Sql代码作为LINQ2对象进行单元测试时,访问的null导航属性不会引发异常,而是优雅地处理它 我正在尝试为所有ExpressionType成员实施测试。如何创建表达式语法以创建ExpressionType

如何创建
表达式
where

Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse
背景信息 我正在创建EnumerableQuery的自定义版本,其中我重写了所有表达式以处理空检查。因此,当将EF Linq2Sql代码作为LINQ2对象进行单元测试时,访问的
null
导航属性不会引发异常,而是优雅地处理它

我正在尝试为所有
ExpressionType
成员实施测试。如何创建表达式语法以创建
ExpressionType.IsTrue
ExpressionType.IsFalse
节点

尝试1。x=>x
其中
条款:

queryable.Where(x => x.L1.L2.L3.L4.L5.Boolean);
queryable.Where(x => !(x.L1.L2.L3.L4.L5.Boolean && x.L1.L2.L3.L4.L5.Boolean));
返回

ExpressionType.MemberAccess
ExpressionType.Not
     ExpressionType.AndAlso
         Left = ExpressionType.MemberAccess
         Right = ExpressionType.MemberAccess
ExpressionType.Constant
尝试2。x=>!(x&y) 以下
Where
条款:

queryable.Where(x => x.L1.L2.L3.L4.L5.Boolean);
queryable.Where(x => !(x.L1.L2.L3.L4.L5.Boolean && x.L1.L2.L3.L4.L5.Boolean));
返回

ExpressionType.MemberAccess
ExpressionType.Not
     ExpressionType.AndAlso
         Left = ExpressionType.MemberAccess
         Right = ExpressionType.MemberAccess
ExpressionType.Constant
尝试3。x=>true
其中
子句

queryable.Where(x => true);
返回

ExpressionType.MemberAccess
ExpressionType.Not
     ExpressionType.AndAlso
         Left = ExpressionType.MemberAccess
         Right = ExpressionType.MemberAccess
ExpressionType.Constant
评论
我猜这些
ExpressionType
仅在手动创建表达式树时使用,并且希望返回类似于
ExpressionType.Constant(true)
的表达式,但开销较小?

,据我所知,
ExpressionType.IsTrue
ExpressionType.IsFalse
分别表示一元运算符和。他们不是“低开销”的常客

也就是说,我还不能得到一个表达式来“自动”创建其中一个节点。编译器只需发出对
op_true
的调用,该调用显示为
ExpressionType.call
。因此,它看起来像是在手动构建表达式树时真正显示出来的。实际上,您可以通过调用创建此类型