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