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); } }
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); } } } }
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); } } } }