Нет описания

PredicateExtensionses.cs 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace CallCenter.Utility.Linq
  8. {
  9. public static class PredicateExtensionses
  10. {
  11. public static Expression<Func<T, bool>> True<T>()
  12. {
  13. return f => true;
  14. }
  15. public static Expression<Func<T, bool>> All<T>() { return f => true; }
  16. public static Expression<Func<T, bool>> False<T>() { return f => false; }
  17. public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right)
  18. {
  19. var candidateExpr = Expression.Parameter(typeof(T), "candidate");
  20. var parameterReplacer = new ParameterReplacer(candidateExpr);
  21. var left = parameterReplacer.Replace(exp_left.Body);
  22. var right = parameterReplacer.Replace(exp_right.Body);
  23. var body = Expression.And(left, right);
  24. exp_left = Expression.Lambda<Func<T, bool>>(body, candidateExpr);
  25. return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
  26. }
  27. public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> exp_left, Expression<Func<T, bool>> exp_right)
  28. {
  29. var candidateExpr = Expression.Parameter(typeof(T), "candidate");
  30. var parameterReplacer = new ParameterReplacer(candidateExpr);
  31. var left = parameterReplacer.Replace(exp_left.Body);
  32. var right = parameterReplacer.Replace(exp_right.Body);
  33. var body = Expression.Or(left, right);
  34. return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
  35. }
  36. }
  37. internal class ParameterReplacer : ExpressionVisitor
  38. {
  39. public ParameterReplacer(ParameterExpression paramExpr)
  40. {
  41. this.ParameterExpression = paramExpr;
  42. }
  43. public ParameterExpression ParameterExpression { get; private set; }
  44. public Expression Replace(Expression expr)
  45. {
  46. return this.Visit(expr);
  47. }
  48. protected override Expression VisitParameter(ParameterExpression p)
  49. {
  50. return this.ParameterExpression;
  51. }
  52. }
  53. }