Beispiel #1
0
        /// <summary>
        /// 对命令文本进行分段处理,使之能够返回小范围内的数据。
        /// </summary>
        /// <param name="commandText">命令文本。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <returns>处理后的分段命令文本。</returns>
        /// <exception cref="SegmentNotSupportedException">当前数据库或版本不支持分段时,引发该异常。</exception>
        public virtual string Segment(string commandText, IDataSegment segment)
        {
            var orderBy  = DbUtility.FindOrderBy(commandText);
            var regAlias = new Regex(@"(\w+)?\.");

            //如果有排序
            if (!string.IsNullOrEmpty(orderBy))
            {
                //去除子句中的Order并移到OVER后
                commandText = string.Format(@"
                    SELECT T.* FROM 
                    (
                        SELECT T.*, ROW_NUMBER() OVER ({2}) AS ROW_NUM 
                        FROM ({0}) T
                    ) T 
                    WHERE {1}",
                                            commandText.Replace(orderBy, string.Empty).Trim(),
                                            segment.Condition("ROW_NUM"),
                                            regAlias.Replace(orderBy, string.Empty));
            }
            else
            {
                commandText = string.Format(@"
                    SELECT T.* FROM 
                    (
                        SELECT T.*, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ROW_NUM 
                        FROM ({0}) T
                    ) T 
                    WHERE {1}",
                                            commandText, segment.Condition("ROW_NUM"));
            }
            return(commandText);
        }
Beispiel #2
0
        /// <summary>
        /// 对命令文本进行分段处理,使之能够返回小范围内的数据。
        /// </summary>
        /// <param name="commandText">命令文本。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <returns>处理后的分段命令文本。</returns>
        /// <exception cref="SegmentNotSupportedException">当前数据库或版本不支持分段时,引发该异常。</exception>
        public virtual string Segment(string commandText, IDataSegment segment)
        {
            var regxOrder = new Regex(@"order\s+by ([\W|\w])+", RegexOptions.IgnoreCase);
            var regAlias  = new Regex(@"(\S+)?\.");

            //如果有排序
            if (regxOrder.IsMatch(commandText))
            {
                var matchs = regxOrder.Matches(commandText);
                //去除子句中的Order并移到OVER后
                commandText = string.Format(@"
                    SELECT T.* FROM 
                    (
                        SELECT T.*, ROW_NUMBER() OVER ({2}) AS ROW_NUM 
                        FROM ({0}) T
                    ) T 
                    WHERE {1}",
                                            regxOrder.Replace(commandText, "").Trim(),
                                            segment.Condition("ROW_NUM"),
                                            regAlias.Replace(matchs[matchs.Count - 1].Value, ""));
            }
            else
            {
                commandText = string.Format(@"
                    SELECT T.* FROM 
                    (
                        SELECT T.*, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ROW_NUM 
                        FROM ({0}) T
                    ) T 
                    WHERE {1}",
                                            commandText, segment.Condition("ROW_NUM"));
            }
            return(commandText);
        }