从UnaryExpression C#

时间:2018-04-27 16:02:31

标签: c# .net linq lambda

我想通过添加到现有表达式来扩展它。 所以逻辑上我想要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实例提供此部分,但它是私有成员我认为不能真正使用它。 如果您需要更多信息,请告诉我。

1 个答案:

答案 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属性来获取身体。