コード例 #1
0
        //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);
        }
コード例 #2
0
        /// <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);
        }