【问题标题】:Get Linq.Expression's Body from a UnaryExpression C#从 UnaryExpression C# 获取 Linq.Expression 的主体
【发布时间】:2018-04-27 16:02:31
【问题描述】:

我想通过添加来扩展现有表达式。 所以逻辑上我想要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")

我有一个已定义 where 表达式的 IQueryable 实例,例如:

{AuditJournalEntity[].Where(o => (((o.AuditDateTime > 10/04/2018 00:00:00) AndAlso (o.AuditDateTime < 18/04/2018 00:00:00))))}

所以我可以使用 Arguments 数组 (Arguments[1]) 获取实际的 where 表达式:

{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 实例来提供这部分,但我认为它是一个私有成员,所以不能真正使用它。 如果您需要更多信息,请告诉我。

【问题讨论】:

  • LINQPad 对检查Expression 对象并查看其属性的Dump 方法非常有用。 LINQKit 有用于查询的方法。另一种方法请参见我的回答 here

标签: c# .net linq lambda


【解决方案1】:

您可以使用UnaryExpression.Operand 属性。

在您的场景中,我猜您想要获取谓词 lambda 表达式。对于IQueryable&lt;T&gt; 源,它通过Expression.Quote 方法包装在UnaryExpression 中。所以你可以使用这样的东西:

static LambdaExpression ExtractLambda(Expression source)
{
    while (source != null && source.NodeType == ExpressionType.Quote)
        source = ((UnaryExpression)source).Operand;
    return source as LambdaExpression;
}

然后您可以使用LambdaExpression.Body 属性获取正文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2021-11-16
    • 2019-12-21
    相关资源
    最近更新 更多