Exemplo n.º 1
0
        public virtual SqlStatement BuildCrudUpdateOne(DbTableInfo table, EntityRecord rec)
        {
            var placeHolders = new SqlPlaceHolderList();
            // find modified columns
            var setExprs = new List <SqlFragment>();

            foreach (var col in table.UpdatableColumns)
            {
                if (!rec.IsValueChanged(col.Member))
                {
                    continue;
                }
                var valueSql = new SqlColumnValuePlaceHolder(col);
                placeHolders.Add(valueSql);
                setExprs.Add(new CompositeSqlFragment(col.SqlColumnNameQuoted, SqlTerms.Equal, valueSql));
            }
            var setList     = SqlFragment.CreateList(SqlTerms.Comma, setExprs);
            var whereCond   = BuildWhereConditonForUpdateDeleteOne(table, placeHolders);
            var whereClause = new CompositeSqlFragment(SqlTerms.Where, whereCond);
            var sql         = SqlDialect.SqlCrudTemplateUpdate.Format(table.SqlFullName, setList, whereClause);
            var stmt        = new SqlStatement(SqlKind.UpdateOne, sql, placeHolders, DbExecutionType.NonQuery,
                                               SqlDialect.PrecedenceHandler, QueryOptions.NoQueryCache);

            return(stmt);
        }
Exemplo n.º 2
0
        // InsertMany will never be reused, so we prefer to use literals, not parameters
        public virtual SqlStatement BuildCrudInsertMany(DbTableInfo table, IList <EntityRecord> records, IColumnValueFormatter formatter)
        {
            // list of column placeholders
            var insertColPhs = GetColumnPlaceholdersForInsert(table, records);
            //values rows
            var rowFragments = new List <SqlFragment>();
            var colValueSqls = new List <SqlFragment>();

            foreach (var rec in records)
            {
                colValueSqls.Clear();
                foreach (var colPh in insertColPhs)
                {
                    colValueSqls.Add(new TextSqlFragment(formatter.FormatColumnValuePlaceHolder(colPh, rec)));
                }
                var valuesRow = CompositeSqlFragment.Parenthesize(SqlFragment.CreateList(SqlTerms.Comma, colValueSqls));
                rowFragments.Add(valuesRow);
            }
            // assemble SQL
            // column list
            var insertColsSqls = insertColPhs.Select(ph => ph.Column.SqlColumnNameQuoted).ToList();
            var colListSql     = SqlFragment.CreateList(SqlTerms.Comma, insertColsSqls);
            // values rows
            var allValuesSql = SqlFragment.CreateList(SqlTerms.CommaNewLineIndent, rowFragments);
            var sql          = SqlDialect.SqlCrudTemplateInsert.Format(table.SqlFullName, colListSql, allValuesSql);
            // assemble Insert statement
            var stmt = new SqlStatement(SqlKind.InsertMany, sql, null, DbExecutionType.NonQuery, null, QueryOptions.NoQueryCache);

            return(stmt);
        }
Exemplo n.º 3
0
        public virtual SqlStatement BuildCrudDeleteOne(DbTableInfo table)
        {
            var placeHolders = new SqlPlaceHolderList();
            var whereCond    = BuildWhereConditonForUpdateDeleteOne(table, placeHolders);
            var whereClause  = new CompositeSqlFragment(SqlTerms.Where, whereCond);
            var sql          = SqlDialect.SqlCrudTemplateDelete.Format(table.SqlFullName, whereClause);
            var stmt         = new SqlStatement(SqlKind.DeleteOne, sql, placeHolders, DbExecutionType.NonQuery);

            return(stmt);
        }
Exemplo n.º 4
0
        } //method

        public override SqlFragment BuildSqlForSqlFunctionExpression(SqlFunctionExpression expr)
        {
            switch (expr.FunctionType)
            {
            case SqlFunctionType.Concat:
                // there can be multiple args, > 2, can't use template here
                var argSqls = BuildSqls(expr.Operands);
                var list    = SqlFragment.CreateList(_oracleDialect.ConcatOperator, argSqls);
                return(CompositeSqlFragment.Parenthesize(list));
            }
            return(base.BuildSqlForSqlFunctionExpression(expr));
        }
Exemplo n.º 5
0
        public virtual SqlFragment BuildSelectOutputList(SelectExpression select)
        {
            var outCols = new List <SqlFragment>();

            if (select.Flags.IsSet(SelectExpressionFlags.Distinct))
            {
                //RI: changed code
                var g = select.Group[0];
                foreach (var col in g.Columns)
                {
                    var sqlCol = GetColumnRefSql(col, forOutput: true);
                    outCols.Add(sqlCol);
                }
                var outColsFragment = SqlFragment.CreateList(SqlTerms.Comma, outCols);
                return(outColsFragment);
            }
            //Regular
            var ops = select.GetOperands().ToList();

            // No explicit columns
            if (ops.Count == 0)
            {
                if (select.Group.Count > 0)
                {
                    return(this.SqlDialect.SqlNullAsEmpty);
                }
                else
                {
                    return(SqlTerms.Star);
                }
            }
            foreach (var outExpr in ops)
            {
                var outSql = BuildLinqExpressionSql(outExpr);
                var alias  = GetAlias(outExpr);
                if (!string.IsNullOrEmpty(alias))
                {
                    var aliasPart = new TextSqlFragment(SqlDialect.QuoteName(alias));
                    outSql = new CompositeSqlFragment(outSql, SqlTerms.As, aliasPart);
                }
                outCols.Add(outSql);
            }
            var outColsPart = SqlFragment.CreateList(SqlTerms.Comma, outCols);

            return(outColsPart);
        }
Exemplo n.º 6
0
        public virtual SqlFragment GetColumnRefSql(ColumnExpression column, bool forOutput)
        {
            var         colPart = new TextSqlFragment(column.ColumnInfo.ColumnNameQuoted);
            var         tbl     = column.Table;
            SqlFragment result  = colPart;

            // finish this with col alias
            if (tbl.HasAlias())
            {
                result = new CompositeSqlFragment(tbl.GetAliasSql(), SqlTerms.Dot, colPart);
            }
            if (forOutput && column.HasAlias())
            {
                var colAlias = new TextSqlFragment(column.Alias);
                result = new CompositeSqlFragment(result, colAlias);
            }
            return(result);
        }
Exemplo n.º 7
0
        public virtual SqlFragment BuildTableForFrom(TableExpression te)
        {
            SqlFragment result;

            if (te is SubSelectExpression)
            {
                result = BuildSqlForSqlExpression(te);
            }
            else
            {
                result = new TextSqlFragment(te.TableInfo.FullName);
            }
            if (te.HasAlias())
            {
                result = new CompositeSqlFragment(result, SqlTerms.Space, te.GetAliasSql());
            }
            return(result);
        }
        public virtual SqlStatement BuildLinqUpdateWithSubquery()
        {
            Util.Check(DbModel.Driver.Supports(Data.Driver.DbFeatures.UpdateFromSubQuery),
                       "The database server does not support UPDATE statements with 'FROM <subquery>' clause, cannot translate this LINQ query.");
            var setValueClauses = new List <SqlFragment>();
            var whereExprSqls   = new List <SqlFragment>();

            for (int i = 0; i < Command.TargetColumns.Count; i++)
            {
                var outExpr = Command.SelectOutputValues[i] as SqlExpression;
                var col     = Command.TargetColumns[i];
                // change alias on PK columns - this is necessary to avoid ambiguous names. MS SQL does not like this
                bool isPk = col.Flags.IsSet(DbColumnFlags.PrimaryKey);
                if (isPk)
                {
                    outExpr.Alias += "_";
                }
                var colNamePart      = col.SqlColumnNameQuoted;
                var outExprAliasPart = new TextSqlFragment(SqlDialect.QuoteName(outExpr.Alias));
                var equalExprSql     = SqlDialect.SqlTemplateColumnAssignAliasValue.Format(colNamePart, _fromAlias, outExprAliasPart);
                if (isPk)
                {
                    whereExprSqls.Add(equalExprSql);
                }
                else
                {
                    setValueClauses.Add(equalExprSql);
                }
            }
            var         setClause   = SqlFragment.CreateList(SqlTerms.Comma, setValueClauses);
            SqlFragment whereClause = SqlTerms.Empty;

            if (whereExprSqls.Count > 0)
            {
                var whereCond = SqlFragment.CreateList(SqlTerms.And, whereExprSqls);
                whereClause = new CompositeSqlFragment(SqlTerms.Where, whereCond);
            }
            var fromClauseSql = LinqSqlBuilder.BuildSelectSql(Command.BaseSelect);
            var tableNameSql  = Command.TargetTable.SqlFullName;
            var sqlUpdate     = SqlDialect.SqlCrudTemplateUpdateFrom.Format(tableNameSql, setClause, fromClauseSql, _fromAlias, whereClause);

            return(CreateNonQueryStatement(sqlUpdate, SqlKind.LinqUpdate));
        }
Exemplo n.º 9
0
        public override SqlFragment BuildTableForFrom(TableExpression te)
        {
            var         tableRef = base.BuildTableForFrom(te);
            SqlFragment hint     = null;

            switch (te.LockType)
            {
            case LockType.ForUpdate:  hint = _msDialect.WithUpdateLockHint; break;

            case LockType.NoLock:     hint = _msDialect.WithNoLockHint;   break;

            case LockType.SharedRead:   break;//turns out we do not need any hint here if we run in Snapshot level
            }
            //Note: for MS SQL, table alias (if present) goes before the hint ( ... FROM Tbl t WITH(NOLOCK) ...), so it works as coded
            if (hint != null)
            {
                tableRef = new CompositeSqlFragment(tableRef, hint);
            }
            return(tableRef);
        }
Exemplo n.º 10
0
        public virtual SqlStatement BuildCrudInsertOne(DbTableInfo table, EntityRecord record)
        {
            // list of column names
            var insertCols     = GetColumnsToInsert(table, record);
            var insertColsSqls = insertCols.Select(c => c.SqlColumnNameQuoted).ToList();
            var colListSql     = SqlFragment.CreateList(SqlTerms.Comma, insertColsSqls);
            // values and placeholders
            var placeHolders = new SqlPlaceHolderList();
            var colSqls      = new List <SqlFragment>();

            foreach (var insertCol in insertCols)
            {
                var ph = new SqlColumnValuePlaceHolder(insertCol);
                placeHolders.Add(ph);
                colSqls.Add(ph);
            }
            var valuesFragm = CompositeSqlFragment.Parenthesize(SqlFragment.CreateList(SqlTerms.Comma, colSqls));
            // format SQL
            var sql  = SqlDialect.SqlCrudTemplateInsert.Format(table.SqlFullName, colListSql, valuesFragm);
            var stmt = new SqlStatement(SqlKind.InsertOne, sql, placeHolders, DbExecutionType.NonQuery);

            return(stmt);
        }
Exemplo n.º 11
0
        }//method

        public virtual SqlFragment BuildSqlForSqlExpression(SqlExpression expr)
        {
            switch (expr.SqlNodeType)
            {
            case SqlExpressionType.Alias:
                var aliasExpr = (AliasedExpression)expr;
                return(BuildLinqExpressionSql(aliasExpr.Expression)); //Alias will be added later

            case SqlExpressionType.SqlFunction:
                return(BuildSqlForSqlFunctionExpression((SqlFunctionExpression)expr));

            case SqlExpressionType.Column:
                var colExpr = (ColumnExpression)expr;
                return(GetColumnRefSql(colExpr, forOutput: false));

            case SqlExpressionType.SubSelect:
                var subs      = (SubSelectExpression)expr;
                var subSelect = BuildSqlForSqlExpression(subs.Select);
                return(CompositeSqlFragment.Parenthesize(subSelect));

            case SqlExpressionType.Table:
                var te = (TableExpression)expr;
                return(te.TableInfo.SqlFullName);

            case SqlExpressionType.TableFilter:
                var tfe      = (TableFilterExpression)expr;
                var argParts = BuildSqls(tfe.Columns);
                var sqlTempl = new SqlTemplate(tfe.Filter.EntityFilter.Template.StandardForm);
                var part     = sqlTempl.Format(argParts);
                return(part);

            case SqlExpressionType.ExternalValue:
                var extValue = (ExternalValueExpression)expr;
                var ph       = CreateSqlPlaceHolder(extValue);
                // it is already added to placeholders list
                return(ph);

            case SqlExpressionType.Group:
                var ge = (GroupExpression)expr;
                return(BuildLinqExpressionSql(ge.GroupedExpression));

            case SqlExpressionType.OrderBy:
                return(BuildOrderByMember((OrderByExpression)expr));

            case SqlExpressionType.Aggregate:
                return(BuildAggregateSql((AggregateExpression)expr));

            case SqlExpressionType.Select:
                var selectSql = BuildSelectSql((SelectExpression)expr);
                return(CompositeSqlFragment.Parenthesize(selectSql));


            case SqlExpressionType.DerivedTable:
                // Looks like we never come here
                //!!! investigate this
                //TODO: investigate DerivedTable SQL
                return(SqlTerms.Star);

            default:
                Util.Throw("SqlExpression->SQL not implemented, SqlNodeType: {0}", expr.SqlNodeType);
                return(null); //never happens
            }//switch
        }//method