private void BuildComplexStandalone(DataUpdateContext context, UpdateStatement statement, object data, SchemaMember member) { if (!member.HasChildren) { return; } var complex = (IDataEntityComplexProperty)member.Token.Property; statement.Returning = new ReturningClause(TableDefinition.Temporary()); var slave = new UpdateStatement(complex.Foreign, member); statement.Slaves.Add(slave); //创建从属更新语句的条件子查询语句 var selection = new SelectStatement(statement.Returning.Table.Identifier()); foreach (var link in complex.Links) { ISource source = statement.Table; foreach (var anchor in link.GetAnchors()) { if (anchor.IsComplex) { source = statement.Join(context.Aliaser, source, (IDataEntityComplexProperty)anchor); } else { if (statement.Returning.Table.Field((IDataEntitySimplexProperty)anchor) != null) { statement.Returning.Append(source.CreateField(anchor.Name), ReturningClause.ReturningMode.Deleted); } var field = selection.Table.CreateField(anchor); selection.Select.Members.Add(field); if (selection.Where == null) { selection.Where = Expression.Equal(field, slave.Table.CreateField(link.ForeignKey)); } else { selection.Where = Expression.AndAlso(slave.Where, Expression.Equal(field, slave.Table.CreateField(link.ForeignKey))); } } } } slave.Where = Expression.Exists(selection); foreach (var child in member.Children) { this.BuildSchema(context, slave, slave.Table, member.Token.GetValue(data), child); } }
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 void BuildReturning(DeleteStatement statement, IEnumerable <SchemaMember> schemas) { statement.Returning = new ReturningClause(TableDefinition.Temporary()); foreach (var key in statement.Entity.Key) { statement.Returning.Table.Field(key); statement.Returning.Append(statement.Table.CreateField(key), ReturningClause.ReturningMode.Deleted); } var super = statement.Entity.GetBaseEntity(); while (super != null) { this.BuildInherit(statement, super); super = super.GetBaseEntity(); } foreach (var schema in schemas) { if (schema.Token.Property.IsSimplex) { continue; } var complex = (IDataEntityComplexProperty)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 (statement.Returning.Table.Field(link.Principal) != null) { statement.Returning.Append(src.CreateField(link.Name), ReturningClause.ReturningMode.Deleted); } } this.BuildSlave(statement, schema); } }
private void BuildReturning(Aliaser aliaser, DeleteStatement statement, IEnumerable <SchemaMember> schemas) { statement.Returning = new ReturningClause(TableDefinition.Temporary()); foreach (var key in statement.Entity.Key) { statement.Returning.Table.Field(key); statement.Returning.Append(statement.Table.CreateField(key), ReturningClause.ReturningMode.Deleted); } var super = statement.Entity.GetBaseEntity(); while (super != null) { this.BuildInherit(aliaser, statement, super); super = super.GetBaseEntity(); } foreach (var schema in schemas) { if (schema.Token.Property.IsSimplex) { continue; } var complex = (IDataEntityComplexProperty)schema.Token.Property; ISource src = complex.Entity == statement.Entity ? statement.Table : statement.Join(aliaser, statement.Table, complex.Entity); foreach (var link in complex.Links) { var anchors = link.GetAnchors(); if (anchors.Length > 1) { continue; } ISource source = statement.Table; foreach (var anchor in link.GetAnchors()) { if (anchor.IsComplex) { source = statement.Join(aliaser, source, (IDataEntityComplexProperty)anchor); } else { //某些导航属性可能与主键相同,表定义的字段定义方法(TableDefinition.Field(...))可避免同名字段的重复定义 if (statement.Returning.Table.Field((IDataEntitySimplexProperty)anchor) != null) { statement.Returning.Append(src.CreateField(anchor.Name), ReturningClause.ReturningMode.Deleted); } } } } this.BuildSlave(aliaser, statement, schema); } }