//public ValueCompare<TEntity> Create(Expression<Func<TEntity, bool>> where) //{ // ExpressionBody = where; // return this; //} public ValueCompare <TEntity> Create(Expression <Func <TEntity, bool> > filter) { var getterBody = _parameterRebinder.Visit(filter.Body);//统一参数 ExpressionBody = getterBody; if (ExpressionBody == null) { throw new Exception("ExpressionBody为NULL"); } return(this); }
/// <summary> /// Combines a sequence of expressions using the logical AND. /// </summary> /// <typeparam name="T">The type of parameter of the expressions.</typeparam> /// <param name="expressions">The sequence of expressions to combine.</param> /// <returns> /// The combined expression. /// </returns> public static Expression <Func <T, bool> > And <T>(this IEnumerable <Expression <Func <T, bool> > > expressions) { if (expressions == null) { throw new ArgumentNullException(nameof(expressions), $"Unable to compose And, {nameof(expressions)} parameter cannot be null"); } if (!expressions.Any()) { throw new ArgumentException($"Unable to compose And, {nameof(expressions)} parameter cannot be empty", nameof(expressions)); } var lambda = expressions.First(); var body = lambda.Body; var parameter = lambda.Parameters[0]; foreach (var expression in expressions.Skip(1)) { var visitor = new ParameterRebinder(expression.Parameters[0], parameter); body = Expression.AndAlso(body, visitor.Visit(expression.Body)); } lambda = Expression.Lambda <Func <T, bool> >(body, parameter); return(lambda); }