/// <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); }