示例#1
0
        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);
        }
示例#2
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);
            }
        }