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
。因此,它看起来像是在手动构建表达式树时真正显示出来的。实际上,您可以通过调用创建此类型