Combine two lambda expressions with inner expression

时间:2016-04-15 15:16:13

标签: c# linq lambda expression predicate

I have the next class structure:

    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; }
    }

I'm trying to build an expression at runtime to search entities by User.Name, Order.Name or User.Auths.Email

There are three expressions I'm trying to combine:

    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));

I successfully combined two first expressions using ParameterReplacer from this thread: How to Combine two lambdas

However, when combining resulting expression with email expression I get the next error:

Property 'System.String Email' is not defined for type Order'

Looks like the scope doesn't know anything about inner 'auth' parameter. Is it possible to creeate the expression without rebuilding it from scratch?

1 个答案:

答案 0 :(得分:3)

您使用的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谓词构建器帮助程序。