Exemplo n.º 1
0
        /// <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();
        }