Exemple #1
0
        protected virtual void VisitCollection(ExpressionVisitorContext context, ExpressionCollection collection)
        {
            if (collection.Count == 0)
            {
                return;
            }

            int index = 0;

            foreach (var item in collection)
            {
                if (index++ > 0)
                {
                    context.Write(",");
                }

                this.OnVisit(context, item);
            }
        }
        protected virtual IExpression VisitCollection(ExpressionCollection collection)
        {
            if (collection.Count == 0)
            {
                return(collection);
            }

            int index = 0;

            foreach (var item in collection)
            {
                if (index++ > 0)
                {
                    _output.Append(",");
                }

                this.Visit(item);
            }

            return(collection);
        }
        private static IExpression GetConditionValue(Condition condition, FieldIdentifier field, Action <ParameterExpression> append = null)
        {
            if (append == null)
            {
                throw new ArgumentNullException(nameof(append));
            }

            if (condition.Value == null)
            {
                if (condition.Operator == ConditionOperator.Equal || condition.Operator == ConditionOperator.NotEqual || condition.Operator == ConditionOperator.Like)
                {
                    return(ConstantExpression.Null);
                }

                throw new DataException($"The specified '{condition.Name}' parameter value of the type {condition.Operator.ToString()} condition is null.");
            }

            if (condition.Operator == ConditionOperator.Equal && Range.IsRange(condition.Value))
            {
                condition.Operator = ConditionOperator.Between;
            }

            switch (condition.Operator)
            {
            case ConditionOperator.Between:
                if (Range.IsRange(condition.Value, out var minimum, out var maximum))
                {
                    ParameterExpression minimumParameter;

                    if (object.Equals(minimum, maximum))
                    {
                        condition.Operator      = ConditionOperator.Equal;
                        append(minimumParameter = Expression.Parameter(field, minimum));
                        return(minimumParameter);
                    }

                    ParameterExpression maximumParameter;

                    if (minimum == null)
                    {
                        if (maximum == null)
                        {
                            return(null);
                        }

                        condition.Operator      = ConditionOperator.LessThanEqual;
                        append(maximumParameter = Expression.Parameter(field, maximum));
                        return(maximumParameter);
                    }
                    else
                    {
                        if (maximum == null)
                        {
                            condition.Operator      = ConditionOperator.GreaterThanEqual;
                            append(minimumParameter = Expression.Parameter(field, minimum));
                            return(minimumParameter);
                        }
                        else
                        {
                            append(minimumParameter = Expression.Parameter(field, minimum));
                            append(maximumParameter = Expression.Parameter(field, maximum));

                            return(new RangeExpression(minimumParameter, maximumParameter));
                        }
                    }
                }

                throw new DataException($"The specified '{condition.Name}' parameter value of the type Between condition is invalid.");

            case ConditionOperator.Exists:
            case ConditionOperator.NotExists:
                return(condition.Value as IExpression ??
                       throw new DataException($"Unable to build a subquery corresponding to the specified '{condition.Name}' parameter({condition.Operator})."));

            case ConditionOperator.In:
            case ConditionOperator.NotIn:
                if (condition.Value != null && condition.Value is IEnumerable iterator)
                {
                    var collection = new ExpressionCollection();

                    foreach (var item in iterator)
                    {
                        if (item != null)
                        {
                            collection.Add(Expression.Constant(item));
                        }
                    }

                    if (collection.Count > 0)
                    {
                        return(collection);
                    }
                }

                throw new DataException($"The specified '{condition.Name}' parameter value of the type In condition is null or empty set.");
            }

            var parameter = Expression.Parameter(field, condition.Value);

            append(parameter);
            return(parameter);
        }