private void GenerateForInsertReturnStatement(GenerateContext context, BlockFragment block, ISourceFragment target, TemporaryTableFragment temptable) { var data = (GenerateDataForInsert)context.Data; if (data.ReturnMembers.Any()) { if (data.SubUnits != null) { target = new InheritFragment(context, data.Table); } var select = new SelectFragment(context, target); select.Members.AddRange(data.ReturnMembers.Select(a => target.GetMember(a.Metadata))); if (temptable == null) { select.Where = target.JoinCondition(data.CommitObject, data.Table.Keys); } else { var datatable = temptable.Clone(); select.AddSource(datatable); target.Join(datatable, data.Table.Keys); } block.Add(select); } }
/// <summary> /// 使用临时表形式,生成更新若干数据对象语句, /// 要求数据库拥有<see cref="EDbCapable.TemporaryTable"/> /// 和<see cref="EDbCapable.ModifyJoin"/>两个特性 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="content">更新表达式。</param> /// <returns>语句片段。</returns> protected virtual SqlFragment GenerateForUpdateTempTable(GenerateContext context, DbExpression content) { var data = (GenerateDataForUpdate)context.Data; var name = data.TargetName; var block = new BlockFragment(context); UpdateFragment mainUpdate = null; TemporaryTableFragment temptable = null; var members = data.GetTables().SelectMany(a => a.Members); foreach (var unit in data.GetUnits()) { TemporaryTableFragment current = null; if (temptable == null) { current = new TemporaryTableFragment(context, members); } else { current = new TemporaryTableFragment(context, temptable.Name, members); } GenerateForUpdateRegister(context, content, current); var metadata = unit.Table; var update = new UpdateFragment(context, metadata, name); update.AddSource(update.Target, current); GenerateForUpdateMembers(context, unit, update, current); update.Target.Join(current, metadata.Keys.Concat(metadata.Concurrencys)); block.Add(update); if (unit == data.MainUnit) { mainUpdate = update; } if (temptable == null) { temptable = current; } else { current.Members.ForEach(m => temptable.GetMember(m.Property)); } } block.Insert(0, GenerateCreateTemplateTable(context, temptable, data.CommitObject, data.Items)); if (data.ReturnMembers.Any()) { var target = data.SubUnits == null ? mainUpdate.Target : new InheritFragment(context, data.Table); var select = new SelectFragment(context, target); select.Members.AddRange(data.ReturnMembers.Select(a => target.GetMember(a.Metadata))); var datatable = temptable.Clone(); select.AddSource(datatable); target.Join(datatable, data.Table.Keys); block.Add(select); data.GenerateOutput(); } data.SetConcurrencyExpectCount(data.TableCount + 1); return(block); }
//生成复合集合成员虚拟数据源连接。 private ISourceFragment GenerateVirtualCompositeJoinForCollectionMember(GenerateContext context, DbCollectionMemberExpression content, SelectFragment body, bool iscomposite) { var relation = CreateSource(context, content.RelationSet); body.AddSource(relation); relation.Join = EJoinType.InnerJoin; var pairs = iscomposite ? content.CompositePairs : content.Pairs; relation.Condition = pairs.Select(a => body.CreateExpression(a)).Merge(); return(relation); }
/// <summary> /// 创建通过临时表关联的返回数据语句片段。 /// </summary> /// <param name="unit">内容对象。</param> /// <param name="target">目标对象。</param> /// <param name="temptable">临时表。</param> /// <returns>语句片段。</returns> internal static SelectFragment SelectReturns(this IContentUnit unit, ISourceFragment target, TemporaryTableFragment temptable) { var data = (ContentBase)unit; var context = data.GenerateContext; var select = new SelectFragment(context, target); select.Members.AddRange(unit.ReturnMembers.Select(a => target.GetMember(a.Metadata))); select.AddSource(temptable); target.Join(temptable, data.Table.Keys); return(select); }