protected virtual ColumnAssignment VisitColumnAssignment(ColumnAssignment ca)
        {
            ColumnExpression c = (ColumnExpression)this.Visit(ca.Column);
            Expression       e = this.Visit(ca.Expression);

            return(this.UpdateColumnAssignment(ca, c, e));
        }
 protected ColumnAssignment UpdateColumnAssignment(ColumnAssignment ca, ColumnExpression c, Expression e)
 {
     if (c != ca.Column || e != ca.Expression)
     {
         return(new ColumnAssignment(c, e));
     }
     return(ca);
 }
Exemple #3
0
        protected override ColumnAssignment VisitColumnAssignment(ColumnAssignment ca)
        {
            ca = base.VisitColumnAssignment(ca);
            Expression           expression = ca.Expression;
            NamedValueExpression nv         = null;

            if (expression.NodeType == ExpressionType.Constant)
            {
                var value = (expression as ConstantExpression).Value;
                if (value == null)
                {
                    TypeAndValue tv = new TypeAndValue(ca.Column.Type, null);
                    if (!this.map.TryGetValue(tv, out nv))
                    {
                        string name = "p" + (iParam++);
                        nv = new NamedValueExpression(name, SqlType.Get(ca.Column.Type), Expression.Constant(null, ca.Column.Type));
                        this.map.Add(tv, nv);
                    }
                    expression = nv;
                }
                else
                {
                    var columnType = ca.Column.Type;
                    if (columnType.IsNullable())
                    {
                        columnType = Nullable.GetUnderlyingType(columnType);
                    }

                    if (columnType != value.GetType())
                    {
                        value      = Converter.Convert(value, columnType);
                        expression = Expression.Constant(value);
                    }
                }
            }

            nv = expression as NamedValueExpression;
            if (nv != null)
            {
                expression = new NamedValueExpression(nv.Name, ca.Column.SqlType, nv.Value);
            }
            return(this.UpdateColumnAssignment(ca, ca.Column, expression));
        }
        protected virtual ReadOnlyCollection <ColumnAssignment> VisitColumnAssignments(ReadOnlyCollection <ColumnAssignment> assignments)
        {
            List <ColumnAssignment> alternate = null;

            for (int i = 0, n = assignments.Count; i < n; i++)
            {
                ColumnAssignment assignment = this.VisitColumnAssignment(assignments[i]);
                if (alternate == null && assignment != assignments[i])
                {
                    alternate = assignments.Take(i).ToList();
                }
                if (alternate != null)
                {
                    alternate.Add(assignment);
                }
            }
            if (alternate != null)
            {
                return(alternate.AsReadOnly());
            }
            return(assignments);
        }