public static Expression <Func <TValue, bool> > CreateExpression <TValue>( Expression <Func <TValue, bool> > expressionA, Expression expressionB, ParameterExpression parameter, LambdaMerge typeMerge) where TValue : class { var predicate = expressionB.CreateExpression <TValue>(parameter); if (expressionA.IsNull()) { return(predicate); } var expressionsJoined = JoinExpressions(expressionA, predicate, parameter, typeMerge); return(expressionsJoined); }
private static Expression <Func <TValue, bool> > JoinExpressions <TValue>( Expression <Func <TValue, bool> > predicateA, Expression <Func <TValue, bool> > predicateB, ParameterExpression parameter, LambdaMerge typeMerge) where TValue : class { if (typeMerge == LambdaMerge.And) { var expression = AndAlso(predicateA, predicateB, parameter); return(expression.CreateExpression <TValue>(parameter)); } else { var expression = OrElse(predicateA, predicateB, parameter); return(CreateExpression <TValue>(expression, parameter)); } }
private static Expression <Func <TValue, bool> > MergeExpressions <TValue>( this Expression <Func <TValue, bool> > predicate, LambdaMerge typeMerge, ParameterExpression parameter, Expression <Func <TValue, bool> > predicateMerge) where TValue : class { Expression lambda; if (typeMerge == LambdaMerge.And) { lambda = Expression.AndAlso( Expression.Invoke(predicate, parameter), Expression.Invoke(predicateMerge, parameter)); } else { lambda = Expression.OrElse( Expression.Invoke(predicate, parameter), Expression.Invoke(predicateMerge, parameter)); } return(Expression.Lambda <Func <TValue, bool> >(lambda, parameter)); }