/// <summary> /// 使用重复生成的方式,生成删除多个复合关系对象的语句。 /// </summary> /// <param name="context">生成上下文。</param> /// <returns>语句片段。</returns> protected virtual SqlFragment GenerateForRelationDeleteRepeat(GenerateContext context) { var data = (RelationContent)context.Data; var repeat = new RepeatBlockFragment(context, data.Items, data.CommitObject.Loader); repeat.Block.Add(GenerateForRelationDelete(context)); return(repeat); }
/// <summary> /// 使用重复生成的方式,生成更新多个对象的语句 /// </summary> /// <param name="context">生成上下文。</param> /// <param name="content">更新表达式。</param> /// <returns>语句片段。</returns> protected virtual SqlFragment GenerateForUpdateRepeat(GenerateContext context, DbExpression content) { var data = (GenerateDataForUpdate)context.Data; var block = (BlockFragment)GenerateForUpdateSingle(context, content); var repeat = new RepeatBlockFragment(context, data.Items, data.CommitObject.Loader, block); return(repeat); }
private SqlFragment GenerateForInsertIdentityMultipleRepeat(GenerateContext context, CommitIdentityUnit mainunit, ColumnMetadata rowindex, TemporaryTableFragment temporaryTable, RowIndexFragment rowindexfragment, GenerateDataForInsert data, out TableFragment whileTarget) { var repeatfragment = new RepeatBlockFragment(context, data.Items); var block = repeatfragment.Block; var whileInsert = context.Insert(temporaryTable, mainunit.Table, mainunit.Members.Where(a => a.ValueType != ECommitValueType.Database).Select(a => a.Metadata)); var whileSelect = (QueryBaseFragment)whileInsert.Query; whileSelect.Where = context.Equal(temporaryTable.GetMember(rowindex), new RowIndexFragment(context)); block.Add(whileInsert); var whileUpdate = new UpdateFragment(context, temporaryTable); var getidentity = whileUpdate.CreateExpression( context.Translate(Expression.Call(null, SupportMembers.DbFunctions.GetIdentity))); whileUpdate.SetValue(mainunit.Identity.Metadata, getidentity); whileUpdate.Where = context.Equal(temporaryTable.GetMember(rowindex), new RowIndexFragment(context)); block.Add(whileUpdate); whileTarget = (TableFragment)whileInsert.Target; return(repeatfragment); }