Exemplo n.º 1
0
        /// <summary>
        /// Obtiene el SQL de una referencia a una columna de una tabla.
        /// </summary>
        /// <param name="table">Si es null se devuelve sólo la columna sin el identificador de la tabla</param>
        /// <param name="column">Nombre de la columna. Puede ser * para indicar todas las columnas</param>
        static string TableRefToSql(string table, string column)
        {
            var colSql   = SqlSelect.ColNameToStr(column);
            var tableRaw = table != null ? $"\"{table}\"" : null;

            return(RawTableRefToSql(tableRaw, colSql));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Convierte un <see cref="MemberExpression"/> a SQL, tomando en cuenta los aliases de la lista de froms
        /// y la lógica descrita en <see cref="SqlExprParams"/>
        /// </summary>
        static string SingleMemberToSql(SqlExprParams pars, string baseMemberName, string subpath, MemberExpression mem)
        {
            var memberName = baseMemberName + subpath;

            if (pars.FromListNamed)
            {
                //Si la lista de FROM tiene aliases, el parametro del select no hace referencia a una tabla,
                //si no a un objeto de aliases donde cada propiedad es una tabla o un elemento de un JOIN
                MemberExpression firstExpr = mem;
                while (firstExpr is MemberExpression sm1 && sm1.Expression is MemberExpression sm2)
                {
                    firstExpr = sm2;
                }

                if (IsFromParam(mem.Expression))
                {
                    throw new ArgumentException("No esta soportado obtener una expresión de * en el SingleMemberSql");
                }
                else if (IsFromParam(firstExpr.Expression))
                {
                    return(TableRefToSql(firstExpr.Member.Name, memberName));
                }
                else if (IsRawTableRef(firstExpr.Expression, out var raw))
                {
                    return(RawTableRefToSql(raw, SqlSelect.ColNameToStr(memberName)));
                }
            }
            else
            {
                //Si la lista de FROM no tiene aliases, el parámetro del SELECT hace referencia a la tabla del SELECT

                Expression firstExpr = mem;
                while (firstExpr is MemberExpression sm)
                {
                    firstExpr = sm.Expression;
                }

                if (IsFromParam(firstExpr))
                {
                    return(TableRefToSql(pars.FromListAlias, memberName));
                }
                else if (IsRawTableRef(firstExpr, out var raw))
                {
                    return(RawTableRefToSql(raw, SqlSelect.ColNameToStr(memberName)));
                }
            }

            //Intentamos convertir al Expr a string con el replace:
            var exprRep = SqlFromList.ReplaceStringAliasMembers(mem.Expression, pars.Replace);

            if (exprRep != null)
            {
                return($"{exprRep}.\"{memberName}\"");
            }

            var exprStr = ExprToSql(mem.Expression, pars, false);

            return($"{exprStr}.\"{memberName}\"");
        }
Exemplo n.º 3
0
        /// <summary>
        /// Convierte el cuerpo de la expresión SET a SQL
        /// </summary>
        public static string SetToSql(Expression body,
                                      ParamMode paramMode,
                                      SqlParamDic paramDic,
                                      IEnumerable <SqlFromList.ExprStrRawSql> exprAlias
                                      )
        {
            var b    = new StringBuilder();
            var pars = new SqlExprParams(null, null, false, null, exprAlias.ToList(), paramMode, paramDic);

            //Hacer el rewrite en todo el body:
            var visitor = new SqlRewriteVisitor(pars);

            body = visitor.Visit(body);

            var exprs = SqlSelect
                        .ExtractInitExpr(body)
                        .Select(x => (x.mem, sql: SqlExpression.ExprToSqlStar(x.expr, pars, false)))
            ;

            if (exprs.Any(y => y.sql.star))
            {
                throw new ArgumentException("No esta soportado una expresión star '*' en la asignación de los valores de un INSERT");
            }

            var subpaths = exprs.SelectMany(x => x.sql.sql, (parent, child) => (member: parent.mem, subpath: child));
            var sets     = subpaths.Select(x => (
                                               column: SqlSelect.MemberToColumnName(x.member, x.subpath),
                                               value: x.subpath.Sql))
            ;

            var setSql = sets
                         .Select(x =>
                                 $"{SqlSelect.ColNameToStr(x.column)} = {x.value}"
                                 );

            var sql = string.Join($", {Environment.NewLine}", setSql);

            return(sql);
        }