如何使用 API 组合两个 C# 表达式?

How to combine two C# Expressions using API?

假设我有两个 类,如下所示:

public class A
{
  public B B { get; set; }
}
public class B
{
  public string SomeValue { get; set; } 
}

以及以下表达式:

using System.Linq.Expressions;
// Actual expression much more complicated
Expression<Func<B, string>> mainExpression = b => b.SomeValue; 
Expression<Func<A, B>> aToB = a => a.B;

我将如何组合它们?显然我可以写

Expression<Func<A, string>> newExpression = a => a.B.SomeValue;

但真正的“mainExpression”要复杂得多,我想避免代码重复。

我正在使用 EntityFramework,这些 类 代表数据库表,这就是为什么我需要一个 System.Linq.Expressions.Expression 对象。

您可以将 mainExpression 的参数替换为 aToB 的主体(例如,如果您使用的是早期版本,则使用 ReplacingExpressionVisitor available since EF Core 3.0 or write )并构建一个新的表达式树:

Expression<Func<B, string>> mainExpression = b => b.SomeValue; 
Expression<Func<A, B>> aToB = a => a.B;
var visit = new ReplacingExpressionVisitor(new[] {mainExpression.Parameters[0]}, new[] {aToB.Body})
    .Visit(mainExpression.Body);
var result = Expression.Lambda<Func<A, string>>(visit, aToB.Parameters);