将两个lambda表达式与内部表达式组合
本文关键字:表达式 内部 组合 lambda 两个 | 更新日期: 2024-09-22 19:18:45
我有下一个类结构:
public class Order
{
public User User { get; set; }
public string Name { get; set; }
}
public class Authentication
{
public string Email { get; set; }
}
public class User
{
public string Name { get; set; }
public List<Authentication> Auths { get; set; }
}
我正试图在运行时构建一个表达式,以按User.Name、Order.Name或User.Auths.Email 搜索实体
我试图将三个表达式结合起来:
Expression<Func<Order, bool>> usernameExpression = order => order.Name.Contains(searchValue);
Expression<Func<Order, bool>> nameExpression = order => order.User.Name.Contains(searchValue);
Expression<Func<Order, bool>> emailExpression = order => order.User.Auths.Any(auth => auth.Email.Contains(searchValue));
我使用这个线程中的ParameterReplacer成功地组合了两个第一个表达式:如何组合两个lambdas
然而,当将结果表达式与电子邮件表达式组合时,我会得到下一个错误:
Property 'System.String Email' is not defined for type Order'
作用域似乎对内部"auth"参数一无所知。有可能在不从头开始重建的情况下对表达式进行筛选吗?
您使用的ParameterReplacer过于简化,盲目地替换每个参数。
使用这个替代:
public static class ExpressionUtils
{
public static Expression ReplaceParameter(this Expression expression, ParameterExpression source, Expression target)
{
return new ParameterReplacer { Source = source, Target = target }.Visit(expression);
}
class ParameterReplacer : ExpressionVisitor
{
public ParameterExpression Source;
public Expression Target;
protected override Expression VisitParameter(ParameterExpression node)
{
return node == Source ? Target : base.VisitParameter(node);
}
}
}
或者使用this或this谓词生成器帮助程序。