예제 #1
0
        /// <summary>
        /// 创建通过主键删除的语句片段。
        /// </summary>
        /// <param name="data">内容对象。</param>
        /// <param name="table">删除表的元数据。</param>
        /// <param name="name">指定名称。</param>
        /// <returns>语句片段。</returns>
        internal static DeleteFragment DeleteByKeys(this ContentBase data, TableMetadata table, DbName name = null)
        {
            var delete = new DeleteFragment(data.GenerateContext, table, name);

            delete.Where = delete.Target.JoinCondition(data.CommitObject,
                                                       data.UnionConcurrencyMembers(table, table.Keys));
            return(delete);
        }
예제 #2
0
        internal static InsertValueFragment InsertTemptable(this ContentBase data, TemporaryTableFragment temptable, IEnumerable <CommitMember> members)
        {
            var context = data.GenerateContext;
            var insert  = new InsertValueFragment(context, temptable, data.CommitObject, data.Items);

            data.CommitObject.Parent = insert;
            members.ForEach(member => SetCommitMember(insert, member));
            return(insert);
        }
예제 #3
0
        internal static InsertValueFragment InsertUnit(this ContentBase data, CommitIdentityUnit unit, DbName name = null)
        {
            var context = data.GenerateContext;
            var target  = new TableFragment(context, unit.Table, name);
            var insert  = new InsertValueFragment(context, target, data.CommitObject, data.Items);

            data.CommitObject.Parent = insert;
            unit.Members.ForEach(member => SetCommitMember(insert, member));
            return(insert);
        }
예제 #4
0
        internal static UpdateFragment UpdateByTemptable(this ContentBase data, CommitUnitBase unit, SourceFragment current, DbName name = null)
        {
            var context  = data.GenerateContext;
            var metadata = unit.Table;
            var update   = new UpdateFragment(context, metadata, name);

            update.AddSource(update.Target, current);
            data.SetCommitMembers(update, unit, current);
            update.Target.Join(current, data.UnionConcurrencyMembers(metadata, metadata.Keys));
            return(update);
        }
예제 #5
0
        internal static UpdateFragment UpdateByKeys(this ContentBase data, CommitUnitBase unit, DbName name = null)
        {
            var context  = data.GenerateContext;
            var metadata = unit.Table;
            var update   = new UpdateFragment(context, metadata, name);

            data.CommitObject.Parent = update;
            data.SetCommitMembers(update, unit);
            update.Where = update.Target.JoinCondition(data.CommitObject, data.UnionConcurrencyMembers(metadata, metadata.Keys));
            return(update);
        }
예제 #6
0
        /// <summary>
        /// 创建通过临时博删除的语句片段。
        /// </summary>
        /// <param name="data">内容对象。</param>
        /// <param name="metadata">删除表的元数据。</param>
        /// <param name="temptable">临时表。</param>
        /// <param name="name">指定名称。</param>
        /// <returns>语句片段。</returns>
        internal static DeleteFragment DeleteByTemptable(this ContentBase data
                                                         , TableMetadata metadata, TemporaryTableFragment temptable, DbName name = null)
        {
            var context          = data.GenerateContext;
            var filterMembers    = data.UnionConcurrencyMembers(metadata, metadata.Keys);
            var delete           = new DeleteFragment(context, metadata);
            var current          = delete.Target;
            var currenttemptable = new TemporaryTableFragment(context, filterMembers, temptable.Name);

            delete.AddSource(currenttemptable);
            current.Join(currenttemptable, filterMembers);
            return(delete);
        }
예제 #7
0
        /// <summary>
        /// 创建通过 IN 主键删除的语句片段。
        /// </summary>
        /// <param name="data">内容对象。</param>
        /// <param name="table">删除表的元数据。</param>
        /// <param name="key">主键元数据。</param>
        /// <param name="values">值列表对象。</param>
        /// <param name="name">指定名称。</param>
        /// <returns>语句片段。</returns>
        internal static DeleteFragment DeleteInKey(this ContentBase data, TableMetadata table
                                                   , ColumnMetadata key, ValueListFragment values, DbName name = null)
        {
            var context   = data.GenerateContext;
            var delete    = new DeleteFragment(context, table, data.TargetName);
            var keyMember = delete.Target.GetMember(key);

            delete.Where = new ScalarFragment(context, values, keyMember)
            {
                Function = SupportMembers.Enumerable.Contains
            };
            return(delete);
        }
예제 #8
0
        internal static InsertFragment InsertTemptable(this ContentBase data, TemporaryTableFragment temptable, CommitKeyUnit unit, DbName name = null)
        {
            var members = unit.Keys.Concat(unit.Members).Select(a => a.Metadata);
            var context = data.GenerateContext;
            var table   = new TableFragment(context, unit.Table, name);
            var select  = new SelectFragment(context, temptable);
            var current = new InsertFragment(context, table, select);

            foreach (var member in members)
            {
                select.CreateMember(null, temptable.GetMember(member));
                current.CreateMember(null, member);
            }
            return(current);
        }
예제 #9
0
        private static void SetCommitMembers(this ContentBase data, UpdateFragment update, CommitUnitBase unit, ISourceFragment source = null)
        {
            source = source ?? data.CommitObject;
            foreach (var member in unit.Members)
            {
                switch (member.ValueType)
                {
                case ECommitValueType.Constant:
                    update.SetValue(member.Metadata, source.GetMember(member.Metadata));
                    break;

                case ECommitValueType.Expression:
                    var exp = (CommitExpressionMember)member;
                    update.SetValue(member.Metadata, update.CreateExpression(exp.Expression));
                    break;
                }
            }
        }