如何使用 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);
假设我有两个 类,如下所示:
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);