private TableIdentifier Join(Aliaser aliaser, UpdateStatement statement, SchemaMember schema) { if (schema == null || schema.Token.Property.IsSimplex) { return(null); } //获取关联的源 ISource source = schema.Parent == null ? statement.Table : statement.From.Get(schema.Path); //第一步:处理模式成员所在的继承实体的关联 if (schema.Ancestors != null) { foreach (var ancestor in schema.Ancestors) { source = statement.Join(aliaser, source, ancestor, schema.FullPath); } } //第二步:处理模式成员(导航属性)的关联 var join = statement.Join(aliaser, source, schema); var target = (TableIdentifier)join.Target; statement.Tables.Add(target); //返回关联的目标表 return(target); }
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); } }