/// <summary> /// Generate a command using the current columns, target and parameters /// </summary> /// <param name="dbCommandType"></param> /// <returns></returns> public virtual void UpdateCommand(IDbCommand cmd) { Validate(); // compile all required field paths; this will ensure every table we need to hit will be present List <IFieldPath> paths = new List <IFieldPath>(); paths.Add(new FieldPath(_target.IdField)); paths.AddRange(_columns); paths.AddRange(_orderBy.ConvertAll <IFieldPath>(s => s.Path)); paths.AddRange(_groupBy); SqlString where = null; if (_where != null) { where = _where.ToSqlString().Flatten(); paths.AddRange(where.Parts.FindAll(o => o is IFieldPath).ConvertAll <IFieldPath>(o => (IFieldPath)o)); } // add all field paths and calculate unique joins for all of them var aliases = UniqueFieldPaths.FromPaths(paths); AssignAliases(aliases); var sb = new StringBuilder(); sb.AppendFormat("SELECT {0} FROM {1}", GetColumnDefinitions(aliases), GetFromClause(aliases)); cmd.Parameters.Clear(); if (where != null) { // loop over parts of Where clause // if field, lookup alias and concat // if string, just concat // if parameter, add placeholder text, then add paramater to Command var whereStr = new StringBuilder(); int paramIdx = 0; foreach (var part in where.Parts) { if (part is IFieldPath) { whereStr.AppendFormat("{0}.[{1}]", aliases[(IFieldPath)part].Alias, ((IFieldPath)part).Last.SourceName); } else if (part is SqlStringParameter) { var p = (SqlStringParameter)part; var cmdp = cmd.CreateParameter(); cmdp.ParameterName = String.Concat("@", paramIdx++); cmdp.Value = p.Value; cmd.Parameters.Add(cmdp); whereStr.Append(cmdp.ParameterName); } else { whereStr.Append(part); } } if (whereStr.Length > 0) { sb.Append(" WHERE "); sb.Append(whereStr); } } sb.Append(GetOrderByClause(aliases)); sb.Append(GetGroupByClause(aliases)); cmd.CommandText = sb.ToString(); }