Esempio n. 1
0
        private DeleteStatement BuildSlave(TableDefinition master, IEntityMetadata entity)
        {
            var statement = new DeleteStatement(entity);
            var reference = TableIdentifier.Temporary(master.Name, TEMPORARY_ALIAS);

            if (entity.Key.Length == 1)
            {
                var select = new SelectStatement(reference);
                select.Select.Members.Add(reference.CreateField(master.Fields.First().Name));
                statement.Where = Expression.In(statement.Table.CreateField(entity.Key[0]), select);
            }
            else
            {
                var join = new JoinClause(TEMPORARY_ALIAS, reference, JoinType.Inner);

                foreach (var key in entity.Key)
                {
                    join.Condition.Add(
                        Expression.Equal(
                            statement.Table.CreateField(key),
                            reference.CreateField(key)));
                }

                statement.From.Add(join);
            }

            master.Slaves.Add(statement);

            return(statement);
        }
Esempio n. 2
0
        private TableDefinition BuildMaster(DeleteStatement statement, IEnumerable <SchemaMember> schemas)
        {
            var master = TableDefinition.Temporary();

            master.Slaves.Add(statement);

            statement.Returning = new ReturningClause(TableIdentifier.Temporary(master.Name));

            foreach (var key in statement.Entity.Key)
            {
                master.Field(key);
                statement.Returning.Fields.Add(statement.Table.CreateField(key));
            }

            var super = statement.Entity.GetBaseEntity();

            while (super != null)
            {
                this.BuildSlave(master, super);
                super = super.GetBaseEntity();
            }

            if (schemas != null)
            {
                foreach (var schema in schemas)
                {
                    if (schema.Token.Property.IsSimplex)
                    {
                        continue;
                    }

                    var     complex = (IEntityComplexPropertyMetadata)schema.Token.Property;
                    ISource src     = null;

                    if (complex.Entity == statement.Entity)
                    {
                        src = statement.Table;
                    }
                    else
                    {
                        src = statement.Join(statement.Table, complex.Entity);
                    }

                    foreach (var link in complex.Links)
                    {
                        //某些导航属性可能与主键相同,表定义的字段定义方法(TableDefinition.Field(...))可避免同名字段的重复定义
                        if (master.Field(link.Principal) != null)
                        {
                            statement.Returning.Fields.Add(src.CreateField(link.Name));
                        }
                    }

                    this.BuildSlave(master, schema);
                }
            }

            return(master);
        }
Esempio n. 3
0
        private DeleteStatement BuildSlave(TableDefinition master, SchemaMember schema)
        {
            var complex   = (IEntityComplexPropertyMetadata)schema.Token.Property;
            var statement = new DeleteStatement(complex.Foreign);
            var reference = TableIdentifier.Temporary(master.Name, TEMPORARY_ALIAS);

            if (complex.Links.Length == 1)
            {
                var select = new SelectStatement(reference);
                select.Select.Members.Add(reference.CreateField(complex.Links[0].Name));
                statement.Where = Expression.In(statement.Table.CreateField(complex.Links[0].Role), select);
            }
            else
            {
                var join = new JoinClause(TEMPORARY_ALIAS, reference, JoinType.Inner);

                foreach (var link in complex.Links)
                {
                    join.Condition.Add(
                        Expression.Equal(
                            statement.Table.CreateField(link.Role),
                            reference.CreateField(link.Name)));
                }

                statement.From.Add(join);
            }

            var super = statement.Entity.GetBaseEntity();

            if (super != null || schema.HasChildren)
            {
                var temporary = this.BuildMaster(statement, schema.Children);
                master.Slaves.Add(temporary);

                //if(schema.HasChildren)
                //{
                //	foreach(var child in schema.Children)
                //	{
                //		this.BuildSlave(temporary, child);
                //	}
                //}
            }
            else
            {
                master.Slaves.Add(statement);
            }

            return(statement);
        }