예제 #1
0
        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);
            }
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        //生成复合集合成员虚拟数据源连接。
        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);
        }
예제 #4
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);
        }