簡體   English   中英

合並兩個表達式的結果

[英]Combine the results of two expressions

我想組成兩個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 };

可以這么說,呢?DetailedUser繼承了基本用戶的所有邏輯,並設置了用戶對象的DOB屬性。

可以這樣使用:

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

任何幫助將不勝感激。

您將不得不重建表達式以添加字段。

假設這些表達式不會很復雜,而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
//     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM