gpt4 book ai didi

c# - 将两个 lambda 表达式与内部表达式结合起来

转载 作者:太空宇宙 更新时间:2023-11-03 23:17:52 24 4
gpt4 key购买 nike

我有下一个类结构:

    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 成功组合了两个第一个表达式:How to Combine two 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);
}
}
}

或者使用thisthis谓词生成器助手。

关于c# - 将两个 lambda 表达式与内部表达式结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36650934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com