상속: SqlBaseExpression
예제 #1
0
        protected virtual Expression VisitDelete(SqlDeleteExpression deleteExpression)
        {
            var where = Visit(deleteExpression.Where);

            if (deleteExpression.Where != where)
            {
                return(new SqlDeleteExpression(deleteExpression.Table, deleteExpression.Alias, where));
            }

            return(deleteExpression);
        }
예제 #2
0
		protected override Expression VisitDelete(SqlDeleteExpression deleteExpression)
		{
			var projection = deleteExpression.Source as SqlProjectionExpression;

			if (projection == null)
			{
				return deleteExpression;
			}
			
			if (projection.Select.From.NodeType != (ExpressionType)SqlExpressionType.Table)
			{
				throw new NotSupportedException();
			}

			var table = (SqlTableExpression)projection.Select.From;
			var alias = table.Alias;
			var where = AliasReferenceReplacer.Replace(projection.Select.Where, alias, table.Name);
			
			return new SqlDeleteExpression(table, where);
		}
예제 #3
0
        protected override Expression VisitDelete(SqlDeleteExpression deleteExpression)
        {
            SqlDeleteExpression current;

            if (!TryGetCurrent(deleteExpression, out current))
            {
                return(deleteExpression);
            }

            result = result && (current.Alias == deleteExpression.Alias &&
                                current.Table == deleteExpression.Table);

            if (result)
            {
                currentObject = current.Where;
                Visit(deleteExpression.Where);
                currentObject = current;
            }

            return(deleteExpression);
        }
 public abstract void Delete(SqlDeleteExpression deleteExpression);
        protected override Expression VisitDelete(SqlDeleteExpression expression)
        {
            SqlDeleteExpression current;
            if (!TryGetCurrent(expression, out current))
            {
                return expression;
            }

            if (!(this.result &= current.NodeType == expression.NodeType))
            {
                return expression;
            }

            if (!(this.result &= current.Type == expression.Type))
            {
                return expression;
            }

            this.currentObject = current.Source;
            this.Visit(expression.Source);
            if (!this.result)
            {
                return expression;
            }

            this.currentObject = current.Where;
            this.Visit(expression.Where);
            if (!this.result)
            {
                return expression;
            }

            this.currentObject = current;
            return expression;
        }
예제 #6
0
        protected override Expression VisitDelete(SqlDeleteExpression deleteExpression)
        {
            this.Write("DELETE ");
            this.Write("FROM ");
            this.Visit(deleteExpression.Table);
            this.WriteLine();
            this.Write(" WHERE ");
            this.WriteLine();

            this.ignoreAlias = deleteExpression.Alias;
            this.replaceAlias = deleteExpression.Table.Name;

            this.Visit(deleteExpression.Where);

            this.ignoreAlias = "";

            return deleteExpression;
        }
예제 #7
0
		protected virtual Expression VisitDelete(SqlDeleteExpression deleteExpression)
		{
			var source = this.Visit(deleteExpression.Source);
			var where = this.Visit(deleteExpression.Where);

			if (deleteExpression.Source != source || deleteExpression.Where != where)
			{
				return new SqlDeleteExpression(source, where);
			}

			return deleteExpression;
		}
예제 #8
0
        protected virtual Expression VisitDelete(SqlDeleteExpression deleteExpression)
        {
            var where = this.Visit(deleteExpression.Where);

            if (deleteExpression.Where != where)
            {
                return new SqlDeleteExpression(deleteExpression.Table, deleteExpression.Alias, where);
            }

            return deleteExpression;
        }
예제 #9
0
		protected override Expression VisitDelete(SqlDeleteExpression deleteExpression)
		{
			return deleteExpression;
		}
		public abstract Task DeleteAsync(SqlDeleteExpression deleteExpression, CancellationToken cancellationToken);
		public abstract Task DeleteAsync(SqlDeleteExpression deleteExpression);
예제 #12
0
 protected override Expression VisitDelete(SqlDeleteExpression deleteExpression)
 {
     return(base.VisitDelete(deleteExpression));
 }
		protected override Expression VisitUpdate(SqlUpdateExpression expression)
		{
			if (!expression.RequiresIdentityInsert)
			{
				return base.VisitUpdate(expression);
			}

			var tableName = ((SqlTableExpression)expression.Source).Name;

			var typeDescriptor = this
				.typeDescriptorProvider
				.GetTypeDescriptors()
				.Single(c => c.PersistedName == tableName);

			var insertedColumns = expression
				.Assignments
				.OfType<SqlAssignExpression>()
				.Select(c => new { name = ((SqlColumnExpression)c.Target).Name, value = c.Value, propertyDescriptor = typeDescriptor.GetPropertyDescriptorByColumnName(((SqlColumnExpression)c.Target).Name) })
				.ToList();

			var columnInfos = QueryBinder
				.GetColumnInfos(this.typeDescriptorProvider, typeDescriptor.PersistedProperties.Where(c => insertedColumns.All(d => d.propertyDescriptor != c)))
				.ToList();

			var visitedUpdated = (SqlUpdateExpression)base.VisitUpdate(expression);
			var selectIntoExpression = new SqlSelectExpression
			(
				typeof(void),
				null,
				columnInfos.Select
				(
					c => new SqlColumnDeclaration
					(
						null, new SqlColumnExpression(c.DefinitionProperty.PropertyType, null, c.GetColumnName())
					)
				)
				.Concat(insertedColumns.Select(d => d.value.Type.GetUnwrappedNullableType() == typeof(bool) ? new SqlColumnDeclaration(d.name, new BitBooleanExpression(d.value)) : new SqlColumnDeclaration(d.name, d.value)))
				.ToReadOnlyCollection(),
				visitedUpdated.Source,
				visitedUpdated.Where,
				null, null, false, null, null, false, false, new SqlTableExpression("#TEMP")
			);

			var selectExpression = new SqlSelectExpression(typeof(void), null, null, selectIntoExpression.Into, null, null);
			var insertExpression = new SqlInsertIntoExpression(visitedUpdated.Source, columnInfos.Select(c => c.GetColumnName()).Concat(insertedColumns.Select(c => c.name)).ToReadOnlyCollection(), null, selectExpression, null, true);
			var deleteExpression = new SqlDeleteExpression(visitedUpdated.Source, visitedUpdated.Where);
			
			var list = new List<Expression>
			{
				selectIntoExpression,
				deleteExpression,
				new SqlSetCommandExpression("IDENTITY_INSERT", visitedUpdated.Source, new SqlKeywordExpression("ON")),
				insertExpression,
				new SqlSetCommandExpression("IDENTITY_INSERT", visitedUpdated.Source, new SqlKeywordExpression("OFF")),
			};

			return new SqlStatementListExpression(list);
		}
		public override void Delete(SqlDeleteExpression deleteExpression)
		{
			var formatResult = this.SqlDatabaseContext.SqlQueryFormatterManager.Format(deleteExpression, SqlQueryFormatterOptions.Default);

			using (var command = this.CreateCommand())
			{
				command.CommandText = formatResult.CommandText;

				foreach (var value in formatResult.ParameterValues)
				{
					this.AddParameter(command, value.Type, value.Value);
				}

				Logger.Info(() => this.FormatCommand(command));

				try
				{
					var count = command.ExecuteNonQueryEx(this.DataAccessModel);
				}
				catch (Exception e)
				{
					var decoratedException = LogAndDecorateException(e, command);

					if (decoratedException != null)
					{
						throw decoratedException;
					}

					throw;
				}
			}
		}
예제 #15
0
		protected override Expression VisitDelete(SqlDeleteExpression deleteExpression)
		{
			this.Write("DELETE ");
			this.Write("FROM ");
			this.Visit(deleteExpression.Source);

			if (deleteExpression.Where != null)
			{
				this.WriteLine();
				this.Write(" WHERE ");
				this.WriteLine();
				this.Visit(deleteExpression.Where);
			}

			this.WriteLine(";");

			return deleteExpression;
		}