Joining multiple where clauses in LINQ as OR instead of AND

前端 未结 7 920
情书的邮戳
情书的邮戳 2020-12-16 13:33

Is there anyway to join LINQ where clauses as OR ?

var ints = new [] { 1, 3, 5, 7 };

var query = from i in ints select i;

query = query.Where (q => q ==         


        
7条回答
  •  粉色の甜心
    2020-12-16 14:03

    Using ExpressionVisitor to help to build the expression base on two expressions with OR/AND relationship. This answer is from Jeffery Zhao's blog.

    internal class ParameterReplacer : ExpressionVisitor
    {
        public ParameterReplacer(ParameterExpression paramExpr)
        {
            this.ParameterExpression = paramExpr;
        }
    
        public ParameterExpression ParameterExpression { get; private set; }
    
        public Expression Replace(Expression expr)
        {
            return this.Visit(expr);
        }
    
        protected override Expression VisitParameter(ParameterExpression p)
        {
            return this.ParameterExpression;
        }
    }
    
    public static Expression> And(this Expression> one, Expression> another)
    {
        var candidateExpr = Expression.Parameter(typeof(T), "candidate");
        var parameterReplacer = new ParameterReplacer(candidateExpr);
    
        var left = parameterReplacer.Replace(one.Body);
        var right = parameterReplacer.Replace(another.Body);
        var body = Expression.And(left, right);
    
        return Expression.Lambda>(body, candidateExpr);
    }
    
    public static Expression> Or(this Expression> one, Expression> another)
    {
        var candidateExpr = Expression.Parameter(typeof(T), "candidate");
        var parameterReplacer = new ParameterReplacer(candidateExpr);
    
        var left = parameterReplacer.Replace(one.Body);
        var right = parameterReplacer.Replace(another.Body);
        var body = Expression.Or(left, right);
    
        return Expression.Lambda>(body, candidateExpr);
    }
    

提交回复
热议问题