3

这是一个简单的类

public class Parent
{
    public Child Child { get; set; }
}

这是我正在尝试实施的方法

Expression<Func<Parent, long>> GetChildIDExpr(Expression<Func<Child, long>> objectIdExpr)
{
    //So I need to return an expression that can accept a Parent
    //and apply the given expression to its Child property.
}

听起来很简单,但我就是做不出来!

我怎样才能实现这个方法?

编辑:

我正在使用 LINQ to Entities,所以调用Expression.Invoke不起作用。

4

2 回答 2

1

最终,您似乎想要组合表达式。但问题是:表达式树是不可变的,它们将保持它们的参数引用,这使得它们很难链接在一起。然而,这并不是说它不能完成(或者不是太难)。但是,您需要ExpressionVisitor的帮助,它将交换父参数引用和子参数引用。

class SwapVisitor : ExpressionVisitor
{
    private readonly Expression from, to;
    public SwapVisitor(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }
    public override Expression Visit(Expression node)
    {
         return node == from ? to : base.Visit(node);
    }
}

然后,您可以将它们链接在一起GetChildIDExpr

Expression<Func<Parent, long>> GetChildIDExpr(Expression<Func<Child, long>> objectIdExpr)
{
    Expression<Func<Parent, Child>> parentEX = p => p.Child;
    var swap = new SwapVisitor(objectIdExpr.Parameters[0], parentEX.Body);
    var newExpr = Expression.Lambda<Func<Parent, long>>(
           swap.Visit(objectIdExpr.Body), parentEX.Parameters);
    return newExpr;
}

试试看,让我们知道。

于 2012-07-05T20:37:07.207 回答
1

您可以将 LinqKit http://www.albahari.com/nutshell/linqkit.aspxAsExpandable()and Compile()/一起使用Invoke(),它将内联外部表达式,允许在 Linq-to-sql 或 Linq-to-entities 中使用

于 2012-07-06T12:22:40.817 回答