Example #1
0
        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);
            }
        }
Example #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);
        }
        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);
            }
        }