Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
399 views
in Technique[技术] by (71.8m points)

c# - How to merge two Expression<Func<T, T>

I have two expressions like this:

Expression<Func<T, T> exp1 = x => new T { Id = 1 , Name = "string"}

Expression<Func<T, T> exp2 = x => new T { Age = 21 }

How can I merge them?

Result:

Expression<Func<T, T> exp3 = x => new T { Id = 1 , Name = "string" , Age = 21}

T is : IEntityBaseRepository<T> where T : class, IEntityBase, new()

IEntityBase:

public interface IEntityBase
{
    string Id { get; set; }
    string Name { get; set; }
    int Age { get; set; }
}

public virtual async Task UpdateAsync(string id, Expression<Func<T, T>> updateFactory)
{
    Expression<Func<T, T>> updateFactory2 = s => new T { age = 21 };
    //Expression<Func<T, T>> updateFactoryFinal = updateFactory + updateFactory2;
    await _context.Set<T>().Where(w => w.Id == id).UpdateAsync(updateFactoryFinal);
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Because you never use Func argument you can simplify your code and use Func<T>. Next method will merge two (or more) MemberInitExpression into one:

public static Expression<Func<T>> MergeExpressions<T>(params Expression<Func<T>>[] expressions)
  where T : new()
{
    var allBindings = new List<MemberBinding>();
    foreach (var expression in expressions)
    {
        var bindings = ((MemberInitExpression) expression.Body).Bindings;
        allBindings.AddRange(bindings);
    }

    var body = Expression.MemberInit(Expression.New(typeof(T)), allBindings);
    return Expression.Lambda<Func<T>>(body);
}

You can check it online here


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...