コード例 #1
0
        /// <summary>
        /// N-M行  针对可分页进行调整
        /// 方案:
        /// 1,根据条件和排序 检索出全部前M行数据(在GetSQLSelectTopClip已经完成了这一步)
        /// 2,对这M行数据反转(排序反转)
        /// 3,对反转完的数据,取前 M-N+1 行
        /// 4,取完数据以后,再次反转
        /// 如:select * from (select top [M-N+1] * from (select top [M] * from 表 [order by id desc]) [order by id asc]) [order by id desc]
        /// 有一个条件:必须存在排序,如果不存在创建一个
        /// </summary>
        /// <param name="translater"></param>
        /// <returns></returns>
        protected virtual void AdjustPagable(ExpressionTranslater translater)
        {
            var oldSQL = translater.CommandText;
            var exp    = translater.Expression;
            var sql    = SQL_PAGING.ToString();
            IList <OrderByExpression> orderby = exp.IsOrderBy ? exp.OrderByList : new List <OrderByExpression>()
            {
                new OrderByExpression(exp.From.GetIdentityField(), OrderByDirection.Asc)
            };

            sql = sql.Replace("{M_N_1}", (exp.EndIndex.Value - exp.StartIndex.Value + 1).ToString());
            sql = sql.Replace("{OLDORDER}", exp.IsOrderBy ? "" : translater.TranslateOrderyByList(orderby, false));
            sql = sql.Replace("{REVORDER}", translater.TranslateOrderyByList(orderby, true));
            sql = sql.Replace("{ORDER}", translater.TranslateOrderyByList(orderby, false));
            sql = sql.Replace("{OLDSQL}", oldSQL);
            translater.SetCommandText(sql);
        }