我想通过添加到现有表达式来扩展它。 所以逻辑上我想要exp3:
exp1 = o => (((o.AuditDateTime > 10/04/2018 00:00:00) && (o.AuditDateTime < 18/04/2018 00:00:00)))
exp2 = o => (o.EventType == "X")
exp3 = o => (((o.AuditDateTime > 10/04/2018 00:00:00) && (o.AuditDateTime < 18/04/2018 00:00:00))) && (o.EventType == "X")
我有一个IQueryable实例,其中已经定义了Expression,例如:
{AuditJournalEntity[].Where(o => (((o.AuditDateTime > 10/04/2018 00:00:00) AndAlso (o.AuditDateTime < 18/04/2018 00:00:00))))}
所以我可以使用Arguments数组(Arguments [1])获取它自己的实际表达式:
{o => (((o.AuditDateTime > 10/04/2018 00:00:00) AndAlso (o.AuditDateTime < 18/04/2018 00:00:00)))}
但是,我不知道如何抓取UnaryExpression的表达式正文部分,以便稍后我可以添加它。 我想要的是这部分:
(((o.AuditDateTime > 10/04/2018 00:00:00) AndAlso (o.AuditDateTime < 18/04/2018 00:00:00)))
如果在调试中,它能够使用UnaryExpressionProxy实例提供此部分,但它是私有成员我认为不能真正使用它。 如果您需要更多信息,请告诉我。
答案 0 :(得分:2)
您可以使用UnaryExpression.Operand
属性。
在您的场景中,我猜您想获得谓词lambda表达式。 IQueryable<T>
来自UnaryExpression
的{{1}}方法。所以你可以使用这样的东西:
static LambdaExpression ExtractLambda(Expression source)
{
while (source != null && source.NodeType == ExpressionType.Quote)
source = ((UnaryExpression)source).Operand;
return source as LambdaExpression;
}
然后你可以使用Expression.Quote
属性来获取身体。