/// <summary> /// 创建通过主键及值关联的返回数据语句片段。 /// </summary> /// <param name="unit">内容对象。</param> /// <param name="target">目标对象。</param> /// <returns>语句片段。</returns> internal static SelectFragment SelectReturns(this IContentUnit unit, ISourceFragment target) { 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.Where = target.JoinCondition(data.CommitObject, data.Table.Keys); return(select); }
/// <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); }
internal static void GenerateOutput(this IContentUnit unit) { if (unit.ReturnMembers.Any()) { var data = (ContentBase)unit; var returns = unit.ReturnMembers.Select(a => a.Metadata.Member).ToArray(); var metadata = data.GenerateContext.Metadata.Type(data.Items.ClrType); var fields = Utility.Array <int>(metadata.PrimaryMembers.Count, -1); var output = new CollectionOutputInfo(metadata, fields); for (int i = 0; i < metadata.PrimaryMembers.Count; i++) { var member = metadata.PrimaryMembers[i]; fields[i] = Array.IndexOf(returns, member.Member); } data.Items.Output = output; } }
/// <summary> /// 根据属性映射表达式创建提交单元。 /// </summary> /// <param name="data">数据对象。</param> /// <param name="commitUnit">当前提交单元。</param> /// <param name="columns">指定的列元数据集合。</param> /// <param name="content">属性映射表达式。</param> /// <returns>当前提交单元。</returns> public static CommitUnitBase CreateCommitUnit(this IContentUnit data, CommitUnitBase commitUnit, IEnumerable <ColumnMetadata> columns, DbExpression content) { if (content is DbSelectExpression select && select.Item is DbNewExpression newExpression) { foreach (var column in columns) { var generator = data.GetValueGenerator(column); if (newExpression.Members.TryGetValue(column.Member, out DbExpression expression)) { if (expression is DbMemberExpression memberAccess && memberAccess.Member == column.Member && memberAccess.Expression == select.Source.Item) { commitUnit.Add(data.CreateCommitUnitMember(column, generator)); } else { commitUnit.Add(data.CreateCommitUnitMember(column, generator, expression)); } }