Пример #1
0
        private void SetLinkedParameters(IMutateStatement statement, object data)
        {
            if (statement.Schema == null || statement.Schema.Token.Property.IsSimplex)
            {
                return;
            }

            var complex = (IEntityComplexPropertyMetadata)statement.Schema.Token.Property;

            foreach (var link in complex.Links)
            {
                var parameter = statement.Parameters[link.Foreign.Name];
                parameter.Value = this.GetValue(data, link.Principal.Name);
            }
        }
Пример #2
0
        private void SetLinkedParameters(IMutateStatement statement, object data)
        {
            if (statement.Schema == null || statement.Schema.Token.Property.IsSimplex)
            {
                return;
            }

            var             complex  = (IDataEntityComplexProperty)statement.Schema.Token.Property;
            UpdateStatement updation = null;

            foreach (var link in complex.Links)
            {
                if (!statement.HasParameters || !statement.Parameters.TryGet(link.Foreign.Name, out var parameter))
                {
                    continue;
                }

                if (link.Foreign.Sequence == null)
                {
                    parameter.Value = this.GetValue(data, link.Principal.Name);
                }
                else if (statement.Schema.HasChildren && statement.Schema.Children.TryGet(link.Foreign.Name, out var member))
                {
                    /*
                     * 如果复合属性的外链字段含序号器(自增),链接参数值不能直接绑定必须通过执行器动态绑定
                     * 如果当前语句为新增并且含有主键,则在该语句执行之后由其从属语句再更新对应的外链字段的序号器(自增)值
                     */

                    parameter.Schema = member;

                    if (statement is InsertStatement && link.Principal.Entity.Key.Length > 0)
                    {
                        if (updation == null)
                        {
                            updation = new UpdateStatement(link.Principal.Entity);
                            statement.Slaves.Add(updation);

                            foreach (var key in link.Principal.Entity.Key)
                            {
                                var equals = Expression.Equal(
                                    updation.Table.CreateField(key),
                                    Expression.Constant(GetValue(data, key.Name)));

                                if (updation.Where == null)
                                {
                                    updation.Where = equals;
                                }
                                else
                                {
                                    updation.Where = Expression.AndAlso(updation.Where, equals);
                                }
                            }
                        }

                        var field      = updation.Table.CreateField(link.Principal);
                        var fieldValue = Expression.Parameter(field, new SchemaMember(member.Token));
                        updation.Fields.Add(new FieldValue(field, fieldValue));
                        updation.Parameters.Add(fieldValue);
                    }
                }
            }
        }
Пример #3
0
        private void SetLinkedParameters(IMutateStatement statement, object data)
        {
            if (statement.Schema == null || statement.Schema.Token.Property.IsSimplex)
            {
                return;
            }

            var             complex  = (IDataEntityComplexProperty)statement.Schema.Token.Property;
            UpdateStatement updation = null;

            for (int i = 0; i < complex.Links.Length; i++)
            {
                var link = complex.Links[i];

                if (!statement.HasParameters || !statement.Parameters.TryGet(link.ForeignKey.Name, out var parameter))
                {
                    continue;
                }

                if (link.ForeignKey.Sequence == null)
                {
                    object refer = data;

                    foreach (var anchor in link.GetAnchors())
                    {
                        if (Utility.TryGetMemberValue(ref refer, anchor.Name, out var value))
                        {
                            refer = value;
                        }
                    }

                    parameter.Value = refer;
                }
                else if (statement.Schema.HasChildren && statement.Schema.Children.TryGet(link.ForeignKey.Name, out var member))
                {
                    /*
                     * 如果复合属性的外链字段含序号器(自增),链接参数值不能直接绑定必须通过执行器动态绑定
                     * 如果当前语句为新增或增改并且含有主键,则在该语句执行之后由其从属语句再更新对应的外链字段的序号器(自增)值
                     */

                    parameter.Schema = member;

                    if (complex.Entity.Key.Length > 0 && (statement is InsertStatement || statement is UpsertStatement))
                    {
                        if (updation == null)
                        {
                            updation = new UpdateStatement(complex.Entity);
                            statement.Slaves.Add(updation);

                            foreach (var key in complex.Entity.Key)
                            {
                                var equals = Expression.Equal(
                                    updation.Table.CreateField(key),
                                    Expression.Constant(Utility.GetMemberValue(ref data, key.Name) ?? Utility.GetDefaultValue(key.Type, key.Nullable)));

                                if (updation.Where == null)
                                {
                                    updation.Where = equals;
                                }
                                else
                                {
                                    updation.Where = Expression.AndAlso(updation.Where, equals);
                                }
                            }
                        }

                        var field      = updation.Table.CreateField(link.GetAnchors()[0]);
                        var fieldValue = Expression.Parameter(field, new SchemaMember(member.Token));
                        updation.Fields.Add(new FieldValue(field, fieldValue));
                        updation.Parameters.Add(fieldValue);
                    }
                }
            }
        }