| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- using System.Linq.Expressions;
- namespace VberZero.Tools.Lambda;
- public static class LambdaCombiner
- {
- public static Expression<Func<T, bool>> Combine<T>(Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
- {
- if (expression1 == null && expression2 == null)
- {
- return null;
- }
- if (expression1 == null)
- {
- return expression2;
- }
- if (expression2 == null)
- {
- return expression1;
- }
- var parameter = Expression.Parameter(typeof(T));
- var leftVisitor = new ReplaceExpressionVisitor(expression1.Parameters[0], parameter);
- var left = leftVisitor.Visit(expression1.Body);
- var rightVisitor = new ReplaceExpressionVisitor(expression2.Parameters[0], parameter);
- var right = rightVisitor.Visit(expression2.Body);
- return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(left, right), parameter);
- }
- private class ReplaceExpressionVisitor : ExpressionVisitor
- {
- private readonly Expression _oldValue;
- private readonly Expression _newValue;
- public ReplaceExpressionVisitor(Expression oldValue, Expression newValue)
- {
- _oldValue = oldValue;
- _newValue = newValue;
- }
- public override Expression Visit(Expression node)
- {
- if (node == _oldValue)
- {
- return _newValue;
- }
- return base.Visit(node);
- }
- }
- }
|