DbExpressions.SqlQueryTranslator.BuildPagingStatement C# (CSharp) Method

BuildPagingStatement() private method

private BuildPagingStatement ( DbSelectExpression selectExpression ) : DbExpression
selectExpression DbSelectExpression
return DbExpression
        private DbExpression BuildPagingStatement(DbSelectExpression selectExpression)
        {
            var sb = new StringBuilder();
            DbExpression projectionExpression = Visit(selectExpression.ProjectionExpression);

            sb.AppendFormat("SELECT {0} FROM (SELECT {0}, ", projectionExpression);
            sb.Append("ROW_NUMBER() OVER (ORDER BY ");
            if (!selectExpression.OrderByExpression.IsNull() )
                sb.Append(Visit(selectExpression.OrderByExpression));
            else
                sb.Append(Visit(selectExpression.ProjectionExpression));
            sb.Append(") AS [ROW_NUMBER] ");

            if (!selectExpression.FromExpression.IsNull())
            {
                sb.AppendLine();
                sb.AppendLine("FROM ");
                sb.AppendFormat(1, "{0} ", Visit(selectExpression.FromExpression));
            }

            if (!selectExpression.WhereExpression.IsNull())
            {
                sb.AppendLine();
                sb.AppendLine("WHERE ");
                sb.AppendFormat(1, "{0} ", Visit(selectExpression.WhereExpression));
            }

            sb.Append(") AS __numbered__result ");

            DbExpression skipSqlExpression = Visit(selectExpression.SkipExpression);
            if (!selectExpression.TakeExpression.IsNull())
            {
                DbExpression takeSqlExpression = Visit(selectExpression.TakeExpression);

                sb.AppendFormat("WHERE [ROW_NUMBER] BETWEEN {0} + 1 AND {0} + {1} ", skipSqlExpression,
                                takeSqlExpression);
            }
            else
                sb.AppendFormat("WHERE [ROW_NUMBER] > {0} ", skipSqlExpression);

            sb.Append("ORDER BY [ROW_NUMBER]");

            if (selectExpression.IsSubQuery)
                return ExpressionFactory.Sql(string.Format("({0})", sb));

            return ExpressionFactory.Sql(sb.ToString().Trim());
        }