Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 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;
     }
 }
Beispiel #4
0
 /// <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));
                 }
             }