| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- using System;
- using System.Linq;
- using System.Linq.Expressions;
- namespace SKMC.Api.Common.Expressions
- {
- public static class Predicator
- {
- public static Expression<Func<T, bool>> GetTrue<T>() { return f => true; }
- public static Expression<Func<T, bool>> GetFalse<T>() { return f => false; }
- public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
- {
- return first.AndAlso<T>(second, Expression.AndAlso);
- }
- public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
- {
- return first.AndAlso<T>(second, Expression.OrElse);
- }
- private static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2, Func<Expression, Expression, BinaryExpression> func)
- {
- var parameter = Expression.Parameter(typeof(T));
- var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
- var left = leftVisitor.Visit(expr1.Body);
- var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
- var right = rightVisitor.Visit(expr2.Body);
- return Expression.Lambda<Func<T, bool>>(
- func(left, right), parameter);
- }
- public static Expression<Func<T, bool>> AggregateAnd<T>(Expression<Func<T, bool>>[] input)
- {
- return input.Aggregate((l, r) => l.And(r));
- }
- 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);
- }
- }
- }
- }
|