示例#1
0
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        protected override void GenerateOrderings(SelectExpression selectExpression)
        {
            base.GenerateOrderings(selectExpression);

            // In SQL Server, if an offset is specified, then an ORDER BY clause must also exist.
            // Generate a fake one.
            if (!selectExpression.Orderings.Any() && selectExpression.Offset != null)
            {
                Sql.AppendLine().Append("ORDER BY (SELECT 1)");
            }
        }
        public override Expression VisitSelect(SelectExpression selectExpression)
        {
            base.VisitSelect(selectExpression);

            //And here we check if query requires recompilation
            if (selectExpression.Tags.Contains(QueryHints.RecompileTag))
            {
                Sql.AppendLine().AppendLine("option(recompile)");
            }

            return(selectExpression);
        }
 protected override Expression VisitConditional(ConditionalExpression conditionalExpression)
 {
     Check.NotNull(conditionalExpression, nameof(conditionalExpression));
     Sql.AppendLine("CASE");
     using (Sql.Indent()) {
         Sql.Append("WHEN ");
         Visit(conditionalExpression.Test);
         Sql.AppendLine();
         Sql.Append("THEN ");
         if (conditionalExpression.IfTrue is ConstantExpression constantExpression && constantExpression.Type == typeof(bool))
         {
             Sql.Append(((bool)constantExpression.Value) ? TypedTrueLiteral : TypedFalseLiteral);
         }
        public void Delete(Cliente objeto)
        {
            Sql.Clear();

            Sql.AppendLine("DELETE FROM Clientes ");
            Sql.AppendLine("WHERE Id = @Id ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());

            Command.Parameters.AddWithValue("@Id", objeto.Id);

            Command.ExecuteNonQuery();
        }
        public List <Cliente> SelectAll()
        {
            Sql.Clear();

            Sql.AppendLine(" SELECT * FROM Clientes ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());
            var Reader  = AcessoDados.Reader(Command);

            var Clientes = Cast(Reader);

            return(Clientes);
        }
        public List <Endereco> SelectAll()
        {
            Sql.Clear();

            Sql.AppendLine(" SELECT * FROM Endereco ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());
            var Reader  = AcessoDados.Reader(Command);

            var Enderecos = Cast(Reader);

            return(Enderecos);
        }
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            if (selectExpression.Offset == null)
            {
                return;
            }

            if (!selectExpression.OrderBy.Any())
            {
                Sql.AppendLine().Append("ORDER BY 'a'");
            }

            Sql.AppendLine().Append(" SKIP ");
            Visit(selectExpression.Offset);
        }
        public override Expression VisitFromSql(FromSqlExpression fromSqlExpression)
        {
            Check.NotNull(fromSqlExpression, nameof(fromSqlExpression));

            Sql.AppendLine("(");

            using (Sql.Indent()) {
                GenerateFromSql(fromSqlExpression.Sql, fromSqlExpression.Arguments, ParameterValues);
            }

            Sql.Append(") ")
            .Append(SqlGenerator.DelimitIdentifier(fromSqlExpression.Alias));

            return(fromSqlExpression);
        }
示例#9
0
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            if (selectExpression.Projection.OfType <RowNumberExpression>().Any())
            {
                return;
            }

            if (selectExpression.Offset != null &&
                !selectExpression.OrderBy.Any())
            {
                Sql.AppendLine().Append("ORDER BY @@ROWCOUNT");
            }

            base.GenerateLimitOffset(selectExpression);
        }
		/// <summary>
		/// 重写LimitOffset分页(12c支持的原生分页)
		/// </summary>
		/// <param name="selectExpression"></param>
		protected override void GenerateLimitOffset(SelectExpression selectExpression)
		{
			try
			{
				if (Check.IsTraceEnabled(m_oracleLogger?.Logger))
				{
					Trace<DbLoggerCategory.Query>.Write(m_oracleLogger, LogLevel.Trace, OracleTraceTag.Entry, OracleTraceClassName.OracleQuerySqlGenerator, OracleTraceFuncName.GenerateLimitOffset);
				}

				Check.NotNull(selectExpression, nameof(selectExpression));
				if (selectExpression.Limit != null && selectExpression.Offset == null)
				{
					Sql.AppendLine().Append("FETCH FIRST ");
					Visit(selectExpression.Limit);
					Sql.Append(" ROWS ONLY");
				}
				else
				{
					base.GenerateLimitOffset(selectExpression);
				}
				if (selectExpression.Limit != null)
				{
					if (Check.IsTraceEnabled(m_oracleLogger?.Logger))
					{
						Trace<DbLoggerCategory.Query>.Write(m_oracleLogger, LogLevel.Trace, OracleTraceTag.SQL, OracleTraceClassName.OracleQuerySqlGenerator, OracleTraceFuncName.GenerateLimitOffset, $"Limit:{selectExpression.Limit.ToString()}");
					}
				}
				else if (Check.IsTraceEnabled(m_oracleLogger?.Logger))
				{
					Trace<DbLoggerCategory.Query>.Write(m_oracleLogger, LogLevel.Trace, OracleTraceTag.SQL, OracleTraceClassName.OracleQuerySqlGenerator, OracleTraceFuncName.GenerateLimitOffset, "Limit:null");
				}
			}
			catch (Exception ex)
			{
				if (Check.IsErrorEnabled(m_oracleLogger?.Logger))
				{
					Trace<DbLoggerCategory.Query>.Write(m_oracleLogger, LogLevel.Error, OracleTraceTag.Error, OracleTraceClassName.OracleQuerySqlGenerator, OracleTraceFuncName.GenerateLimitOffset, ex.ToString());
				}
				throw;
			}
			finally
			{
				if (Check.IsTraceEnabled(m_oracleLogger?.Logger))
				{
					Trace<DbLoggerCategory.Query>.Write(m_oracleLogger, LogLevel.Trace, OracleTraceTag.Exit, OracleTraceClassName.OracleQuerySqlGenerator, OracleTraceFuncName.GenerateLimitOffset);
				}
			}
		}
        protected override void GenerateTop(SelectExpression selectExpression)
        {
            if (selectExpression.Limit != null)
            {
                Sql.AppendLine().Append("FIRST ");
                Visit(selectExpression.Limit);
                Sql.AppendLine().Append(" ");
            }

            if (selectExpression.Offset != null)
            {
                Sql.Append("SKIP ");
                Visit(selectExpression.Offset);
                Sql.Append(" ");
            }
        }
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
#if SQLCE35
            if (selectExpression.Offset != null)
            {
                throw new NotSupportedException("SKIP clause is not supported by SQL Server Compact 3.5");
            }
#endif
            if ((selectExpression.Offset != null) &&
                !selectExpression.OrderBy.Any())
            {
                Sql.AppendLine().Append("ORDER BY GETDATE()");
            }

            base.GenerateLimitOffset(selectExpression);
        }
示例#13
0
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            Check.NotNull(selectExpression, nameof(selectExpression));

            if (selectExpression.Limit != null || selectExpression.Offset != null)
            {
                Sql.AppendLine()
                .Append("LIMIT ")
                .Append(selectExpression.Limit ?? -1);

                if (selectExpression.Offset != null)
                {
                    Sql.Append(" OFFSET ")
                    .Append(selectExpression.Offset);
                }
            }
        }
        public List <Endereco> Select(Endereco Object)
        {
            Sql.Clear();

            Sql.AppendLine(" SELECT * FROM Endereco ");
            Sql.AppendLine(" WHERE IdCliente = @IdCliente ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());

            Command.Parameters.AddWithValue("@IdCliente", Object.IdCliente);

            var Reader = AcessoDados.Reader(Command);

            var Enderecos = Cast(Reader);

            return(Enderecos);
        }
        public Cliente Find(Cliente objeto)
        {
            Sql.Clear();

            Sql.AppendLine("SELECT * FROM Clientes ");
            Sql.AppendLine("WHERE Clientes.Id = @Id ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());

            Command.Parameters.AddWithValue("@Id", objeto.Id);

            var Reader = AcessoDados.Reader(Command);

            var Cliente = Cast(Reader).FirstOrDefault();

            return(Cliente);
        }
        public Endereco Find(int Id)
        {
            Sql.Clear();

            Sql.AppendLine(" SELECT * FROM Endereco ");
            Sql.AppendLine(" WHERE Id = @Id ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());

            Command.Parameters.AddWithValue("@Id", Id);

            var Reader = AcessoDados.Reader(Command);

            var Enderecos = Cast(Reader);

            return(Enderecos.FirstOrDefault());
        }
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            if (selectExpression.Limit != null || selectExpression.Offset != null)
            {
                Sql.AppendLine().Append("LIMIT ");

                Visit(
                    selectExpression.Offset
                    ?? new SqlConstantExpression(Expression.Constant(-1), selectExpression.Offset.TypeMapping));

                if (selectExpression.Limit != null)
                {
                    Sql.Append(", ");
                    Visit(selectExpression.Limit);
                }
            }
        }
示例#18
0
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            ThrowIf.Argument.IsNull(selectExpression, "selectExpression");

            if (selectExpression.Limit != null || selectExpression.Offset != null)
            {
                Sql.AppendLine().Append("LIMIT ");

                Visit(selectExpression.Limit ?? Expression.Constant(-1));

                if (selectExpression.Offset != null)
                {
                    Sql.Append(" OFFSET ");

                    Visit(selectExpression.Offset);
                }
            }
        }
        public void Update(Cliente objeto)
        {
            Sql.Clear();

            Sql.AppendLine("UPDATE Clientes SET ");
            Sql.AppendLine("  Nome = @Nome, @Sobrenome = @Sobrenome, Idade = @Idade, DataNascimento = @DataNascimento ");
            Sql.AppendLine("WHERE Id = @Id ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());

            Command.Parameters.AddWithValue("@Id", objeto.Id);
            Command.Parameters.AddWithValue("@Nome", objeto.Nome);
            Command.Parameters.AddWithValue("@Sobrenome", objeto.Sobrenome);
            Command.Parameters.AddWithValue("@Idade", objeto.Idade);
            Command.Parameters.AddWithValue("@DataNascimento", objeto.DataNascimento);

            Command.ExecuteNonQuery();
        }
示例#20
0
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            Check.NotNull(selectExpression, nameof(selectExpression));

            if (selectExpression.Limit != null &&
                selectExpression.Offset == null)
            {
                Sql.AppendLine().Append("FETCH FIRST ");

                Visit(selectExpression.Limit);

                Sql.Append(" ROWS ONLY");
            }
            else
            {
                base.GenerateLimitOffset(selectExpression);
            }
        }
        public Cliente Insert(Cliente objeto)
        {
            Sql.Clear();

            Sql.AppendLine("INSERT INTO Clientes (Nome, Sobrenome, Idade, DataNascimento) ");
            Sql.AppendLine("OUTPUT inserted.Id ");
            Sql.AppendLine("VALUES (@Nome, @Sobrenome, @Idade, @DataNascimento) ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());

            Command.Parameters.AddWithValue("@Nome", objeto.Nome);
            Command.Parameters.AddWithValue("@Sobrenome", objeto.Sobrenome);
            Command.Parameters.AddWithValue("@Idade", objeto.Idade);
            Command.Parameters.AddWithValue("@DataNascimento", objeto.DataNascimento);

            objeto.Id = (int)Command.ExecuteScalar();

            return(objeto);
        }
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            Check.NotNull(selectExpression, nameof(selectExpression));

            if ((selectExpression.Limit != null) ||
                (selectExpression.Offset != null))
            {
                Sql.AppendLine()
                .Append("LIMIT ");

                Visit(selectExpression.Limit ?? Expression.Constant(-1));

                if (selectExpression.Offset != null)
                {
                    Sql.Append(" OFFSET ");

                    Visit(selectExpression.Offset);
                }
            }
        }
示例#23
0
        // https://github.com/aspnet/EntityFrameworkCore/issues/19031
        protected override void GenerateOrderings(SelectExpression selectExpression)
        {
            if (selectExpression.Orderings.Any())
            {
                var orderings = selectExpression.Orderings.ToList();

                if (selectExpression.Limit == null &&
                    selectExpression.Offset == null)
                {
                    orderings.RemoveAll(oe => oe.Expression is SqlConstantExpression || oe.Expression is SqlParameterExpression);
                }

                if (orderings.Count > 0)
                {
                    Sql.AppendLine()
                    .Append("ORDER BY ");

                    GenerateList(orderings, e => Visit(e));
                }
            }
        }
示例#24
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            Check.NotNull(selectExpression, nameof(selectExpression));

            if (selectExpression.Limit != null)
            {
                Sql.AppendLine().Append("LIMIT ");
                Visit(selectExpression.Limit);
            }

            if (selectExpression.Offset != null)
            {
                if (selectExpression.Limit == null)
                {
                    // if we want to use Skip() without Take() we have to define the upper limit of LIMIT
                    Sql.AppendLine().Append("LIMIT ").Append(18446744073709551610);
                }
                Sql.Append(" OFFSET ");
                Visit(selectExpression.Offset);
            }
        }
示例#25
0
        protected override void GeneratePredicate([NotNull] Expression predicate)
        {
            Expression       expression = Db2ApplyOptimizations(predicate, true, false);
            BinaryExpression binaryExpression;

            if ((binaryExpression = (expression as BinaryExpression)) != null)
            {
                bool?booleanConstantValue  = GetBooleanConstantValue(binaryExpression.Left);
                bool?booleanConstantValue2 = GetBooleanConstantValue(binaryExpression.Right);
                if (binaryExpression.NodeType == ExpressionType.Equal && booleanConstantValue == true && booleanConstantValue2 == true)
                {
                    return;
                }
                if (binaryExpression.NodeType == ExpressionType.NotEqual && booleanConstantValue == false && booleanConstantValue2 == false)
                {
                    return;
                }
            }
            Sql.AppendLine().Append("WHERE ");
            (this).Visit(expression);
        }
            protected override void VisitQuery(QueryExpression queryExpression)
            {
                switch (queryExpression)
                {
                case MySQLRawQueryExpression rawExpression:
                    Sql.Append(rawExpression.SqlText);
                    break;

                case TransactionExpression transaction:
                    Sql.AppendLine("START TRANSACTION;");
                    foreach (var query in transaction.Queries)
                    {
                        Visit(query);
                    }
                    Sql.AppendLine("COMMIT;");
                    break;

                default:
                    base.VisitQuery(queryExpression);
                    break;
                }
            }
        public Endereco Insert(Endereco objeto)
        {
            Sql.Clear();

            Sql.AppendLine("INSERT INTO Endereco (IdCliente, Logradouro, Bairro, Cidade, Estado, Cep, Tipo) ");
            Sql.AppendLine("OUTPUT inserted.Id ");
            Sql.AppendLine("VALUES (@IdCliente, @Logradouro, @Bairro, @Cidade, @Estado, @Cep, @Tipo) ");

            var Command = AcessoDados.CreateCommand(Sql.ToString());

            Command.Parameters.AddWithValue("@IdCliente", objeto.IdCliente);
            Command.Parameters.AddWithValue("@Logradouro", objeto.Logradouro);
            Command.Parameters.AddWithValue("@Bairro", objeto.Bairro);
            Command.Parameters.AddWithValue("@Cidade", objeto.Cidade);
            Command.Parameters.AddWithValue("@Estado", objeto.Estado);
            Command.Parameters.AddWithValue("@Cep", objeto.Cep);
            Command.Parameters.AddWithValue("@Tipo", objeto.Tipo);

            objeto.Id = (int)Command.ExecuteScalar();

            return(objeto);
        }
示例#28
0
        /// <summary>
        ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
        ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
        ///     any release. You should only use it directly in your code with extreme caution and knowing that
        ///     doing so can result in application failures when updating to a new Entity Framework Core release.
        /// </summary>
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            Check.NotNull(selectExpression, nameof(selectExpression));

            if (selectExpression.Limit != null ||
                selectExpression.Offset != null)
            {
                Sql.AppendLine()
                .Append("LIMIT ");

                Visit(
                    selectExpression.Limit
                    ?? new SqlConstantExpression(Expression.Constant(-1), selectExpression.Offset !.TypeMapping));

                if (selectExpression.Offset != null)
                {
                    Sql.Append(" OFFSET ");

                    Visit(selectExpression.Offset);
                }
            }
        }
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            // Note: For Limit without Offset, SqlServer generates TOP()
            if (selectExpression.Offset != null)
            {
                Sql.AppendLine()
                .Append("OFFSET ");

                Visit(selectExpression.Offset);

                Sql.Append(" ROWS");

                if (selectExpression.Limit != null)
                {
                    Sql.Append(" FETCH NEXT ");

                    Visit(selectExpression.Limit);

                    Sql.Append(" ROWS ONLY");
                }
            }
        }
        /// <inheritdoc />
        protected override void GenerateLimitOffset(SelectExpression selectExpression)
        {
            GaxPreconditions.CheckNotNull(selectExpression, nameof(selectExpression));

            if (selectExpression.Limit != null)
            {
                Sql.AppendLine().Append("LIMIT ");
                Visit(selectExpression.Limit);
            }
            else if (selectExpression.Offset != null)
            {
                // Cloud Spanner requires limit if offset is specified.
                Sql.AppendLine().Append($"LIMIT {int.MaxValue}");
            }

            if (selectExpression.Offset == null)
            {
                return;
            }
            Sql.Append(" OFFSET ");
            Visit(selectExpression.Offset);
        }