PredicateWrap.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System;
  2. using System.Linq.Expressions;
  3. using VCommon.Linq.Expressions.Predicate.Internals;
  4. namespace VCommon.Linq.Expressions.Predicate
  5. {
  6. public static class PredicateWrap
  7. {
  8. public static PredicateWrap<T> Op<T>(this Expression<Func<T, bool>> exp) => new PredicateWrap<T>(exp);
  9. }
  10. public class PredicateWrap<T>
  11. {
  12. private readonly Expression<Func<T, bool>> _expression;
  13. internal PredicateWrap(Expression<Func<T, bool>> expression) => _expression = expression;
  14. public PredicateWrap<T> When(bool condition) => condition ? this : null;
  15. public static implicit operator Expression<Func<T, bool>>(PredicateWrap<T> me)
  16. {
  17. var expression = me?._expression;
  18. if (true == expression?.CanReduce) return (Expression<Func<T, bool>>)expression.Reduce();
  19. return expression;
  20. }
  21. public static implicit operator PredicateWrap<T>(Expression<Func<T, bool>> me) => me == null ? null : new PredicateWrap<T>(me);
  22. public static PredicateWrap<T> operator &(PredicateWrap<T> a, PredicateWrap<T> b)
  23. {
  24. var aIsNull = null == a?._expression;
  25. var bIsNull = null == b?._expression;
  26. if (aIsNull && bIsNull) return null;
  27. if (aIsNull) return b;
  28. if (bIsNull) return a;
  29. return new PredicateWrap<T>(a._expression.And(b._expression));
  30. }
  31. public static PredicateWrap<T> operator &(PredicateWrap<T> a, Expression<Func<T, bool>> b)
  32. {
  33. var aIsNull = null == a?._expression;
  34. var bIsNull = null == b;
  35. if (aIsNull && bIsNull) return null;
  36. if (aIsNull) return b;
  37. if (bIsNull) return a;
  38. return new PredicateWrap<T>(a._expression.And(b));
  39. }
  40. public static PredicateWrap<T> operator &(Expression<Func<T, bool>> a, PredicateWrap<T> b)
  41. {
  42. var aIsNull = null == a;
  43. var bIsNull = null == b?._expression;
  44. if (aIsNull && bIsNull) return null;
  45. if (aIsNull) return b;
  46. if (bIsNull) return a;
  47. return new PredicateWrap<T>(a.And(b._expression));
  48. }
  49. public static PredicateWrap<T> operator |(PredicateWrap<T> a, PredicateWrap<T> b)
  50. {
  51. var aIsNull = null == a?._expression;
  52. var bIsNull = null == b?._expression;
  53. if (aIsNull && bIsNull) return null;
  54. if (aIsNull) return b;
  55. if (bIsNull) return a;
  56. return new PredicateWrap<T>(a._expression.Or(b._expression));
  57. }
  58. public static PredicateWrap<T> operator |(PredicateWrap<T> a, Expression<Func<T, bool>> b)
  59. {
  60. var aIsNull = null == a?._expression;
  61. var bIsNull = null == b;
  62. if (aIsNull && bIsNull) return null;
  63. if (aIsNull) return b;
  64. if (bIsNull) return a;
  65. return new PredicateWrap<T>(a._expression.Or(b));
  66. }
  67. public static PredicateWrap<T> operator |(Expression<Func<T, bool>> a, PredicateWrap<T> b)
  68. {
  69. var aIsNull = null == a;
  70. var bIsNull = null == b?._expression;
  71. if (aIsNull && bIsNull) return null;
  72. if (aIsNull) return b;
  73. if (bIsNull) return a;
  74. return new PredicateWrap<T>(a.Or(b._expression));
  75. }
  76. }
  77. }