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); }