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 に答える