1
1

LinqExtension.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq.Expressions;
  4. namespace Masuit.Tools.Linq
  5. {
  6. /// <summary>
  7. /// LINQ扩展方法
  8. /// </summary>
  9. public static class LinqExtension
  10. {
  11. /// <summary>
  12. /// 与连接
  13. /// </summary>
  14. /// <typeparam name="T">类型</typeparam>
  15. /// <param name="left">左条件</param>
  16. /// <param name="right">右条件</param>
  17. /// <returns>新表达式</returns>
  18. public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
  19. {
  20. return CombineLambdas(left, right, ExpressionType.AndAlso);
  21. }
  22. /// <summary>
  23. /// 或连接
  24. /// </summary>
  25. /// <typeparam name="T">类型</typeparam>
  26. /// <param name="left">左条件</param>
  27. /// <param name="right">右条件</param>
  28. /// <returns>新表达式</returns>
  29. public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
  30. {
  31. return CombineLambdas(left, right, ExpressionType.OrElse);
  32. }
  33. private static Expression<Func<T, bool>> CombineLambdas<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right, ExpressionType expressionType)
  34. {
  35. var visitor = new SubstituteParameterVisitor
  36. {
  37. Sub =
  38. {
  39. [right.Parameters[0]] = left.Parameters[0]
  40. }
  41. };
  42. Expression body = Expression.MakeBinary(expressionType, left.Body, visitor.Visit(right.Body));
  43. return Expression.Lambda<Func<T, bool>>(body, left.Parameters[0]);
  44. }
  45. }
  46. internal class SubstituteParameterVisitor : ExpressionVisitor
  47. {
  48. public Dictionary<Expression, Expression> Sub = new Dictionary<Expression, Expression>();
  49. protected override Expression VisitParameter(ParameterExpression node)
  50. {
  51. return Sub.TryGetValue(node, out var newValue) ? newValue : node;
  52. }
  53. }
  54. }