protected override DbExpression VisitSelectExpression(DbSelectExpression selectExpression)
{
var sb = new StringBuilder();
if (!selectExpression.ProjectionExpression.IsNull())
{
if (selectExpression.IsDistinct)
sb.Append("SELECT DISTINCT ");
else
sb.Append("SELECT ");
sb.AppendLine();
sb.AppendFormat(1, "{0} ", Visit(selectExpression.ProjectionExpression));
}
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));
}
if (!selectExpression.GroupByExpression.IsNull())
{
sb.AppendLine();
sb.AppendLine("GROUP BY ");
sb.AppendFormat(1, "{0} ", Visit(selectExpression.GroupByExpression));
}
if (!selectExpression.HavingExpression.IsNull())
{
sb.AppendLine();
sb.AppendLine("HAVING ");
sb.AppendFormat(1, "{0} ", Visit(selectExpression.HavingExpression));
}
if (!selectExpression.OrderByExpression.IsNull())
{
sb.AppendLine();
sb.AppendLine("ORDER BY ");
sb.AppendFormat(1, "{0} ", Visit(selectExpression.OrderByExpression));
}
if (ContainsSkipAndTake(selectExpression))
sb.AppendFormat("LIMIT {0} OFFSET {1} ", Visit(selectExpression.TakeExpression), Visit(selectExpression.SkipExpression));
else if (ContainsTake(selectExpression))
sb.AppendFormat("LIMIT {0} ", Visit(selectExpression.TakeExpression));
else if (ContainsSkip(selectExpression))
sb.AppendFormat("LIMIT -1 OFFSET {0} ", Visit(selectExpression.SkipExpression));
if (selectExpression.IsSubQuery)
return ExpressionFactory.Sql(string.Format("({0})", sb.ToString().Trim()));
return ExpressionFactory.Sql(sb.ToString().Trim());
}