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); }
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); }
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); }