2

2つのLinq式の結果を作成したいと思います。合成したい結果は、両方の戻りオブジェクトの合成になります。

Expression<Func<Person, User>> basicUser = t => new User() { Name = t.FirstName };
Expression<Func<Person, User>> detailedUser = t => Execute basicUser and add the following  assignments { DOB = t.DOB };

WHERE detailsUserは、いわばbasicUserのすべてのロジックを継承し、UserオブジェクトのDOBプロパティを設定します。

これは次のように使用されます。

context.CreateObjectSet<Persons>().Where(p => p.PersonType == User).Select<Person, User>(detailedUser); 

どんな助けでも大歓迎です。

4

1 に答える 1

2

フィールドを追加するには、式を再構築する必要があります。

これらの式が複雑ではなく、式が常にその形式であると仮定すると、basicUser式を変更して新しいバインディングを追加することができます。あなたは単純な訪問者の助けを借りてそれを行うことができます。

public class AddDobBindingVisitor : ExpressionVisitor
{
    private ParameterExpression parameter;

    protected override Expression VisitLambda<T>(Expression<T> node)
    {
        parameter = node.Parameters.Single();
        return base.VisitLambda(node);
    }

    protected override Expression VisitMemberInit(MemberInitExpression node)
    {
        var member = typeof(User).GetProperty("DOB");
        var newBindings = new[]
        {
            Expression.Bind(member, Expression.Property(parameter, "DOB")),
        };
        var updatedNode = node.Update(
            node.NewExpression,
            node.Bindings.Concat(newBindings));
        return base.VisitMemberInit(updatedNode);
    }
}

次に、変更を適用します。

Expression<Func<Person, User>> basicUser = person => new User()
{
    Name = person.FirstName
};
var detailedUser = (Expression<Func<Person, User>>)new AddDobBindingVisitor()
    .Visit(basicUser);
// detailedUser:
//     person => new User()
//     {
//         Name = person.FirstName,
//         DOB = person.DOB
//     }
于 2012-07-25T21:50:39.180 に答える