using System; using System.Collections.Generic; using System.Linq.Expressions; namespace IRaCIS.Core.Infrastructure.Extention { /// /// LINQ扩展方法 /// public static class LinqExtension { /// /// 与连接 /// /// 类型 /// 左条件 /// 右条件 /// 新表达式 public static Expression> And(this Expression> left, Expression> right) { return CombineLambdas(left, right, ExpressionType.AndAlso); } /// /// 或连接 /// /// 类型 /// 左条件 /// 右条件 /// 新表达式 public static Expression> Or(this Expression> left, Expression> right) { return CombineLambdas(left, right, ExpressionType.OrElse); } private static Expression> CombineLambdas(this Expression> left, Expression> right, ExpressionType expressionType) { var visitor = new SubstituteParameterVisitor { Sub = { [right.Parameters[0]] = left.Parameters[0] } }; Expression body = Expression.MakeBinary(expressionType, left.Body, visitor.Visit(right.Body)); return Expression.Lambda>(body, left.Parameters[0]); } } internal class SubstituteParameterVisitor : ExpressionVisitor { public Dictionary Sub = new Dictionary(); protected override Expression VisitParameter(ParameterExpression node) { return Sub.TryGetValue(node, out var newValue) ? newValue : node; } } }