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