/// <summary>
 /// Visits each node of the <see cref="DbExpression"/> tree and rewrites the tree if any changes has been made to any of the child nodes.
 /// </summary>
 /// <param name="dbExpression">The <see cref="DbExpression"/> to visit.</param>
 /// <returns>A <see cref="DbExpression"/> instance.</returns>
 public virtual DbExpression Visit(DbExpression dbExpression)
 {
     if (dbExpression.IsNull())
         return dbExpression;
     var expressionType = dbExpression.ExpressionType;
     switch (expressionType)
     {
         case DbExpressionType.Function:
             return VisitFunctionExpression((DbFunctionExpression)dbExpression);
         case DbExpressionType.Select:
             return VisitSelectExpression((DbSelectExpression)dbExpression);
         case DbExpressionType.Update:
             return VisitUpdateExpression((DbUpdateExpression)dbExpression);
         case DbExpressionType.Insert:
             return VisitInsertExpression((DbInsertExpression)dbExpression);
         case DbExpressionType.Delete:
             return VisitDeleteExpression((DbDeleteExpression)dbExpression);
         case DbExpressionType.Column:
             return VisitColumnExpression((DbColumnExpression)dbExpression);
         case DbExpressionType.Table:
             return VisitTableExpression((DbTableExpression)dbExpression);
         case DbExpressionType.Binary:
             return VisitBinaryExpression((DbBinaryExpression)dbExpression);
         case DbExpressionType.Constant:
             return VisitConstantExpression((DbConstantExpression)dbExpression);
         case DbExpressionType.Alias:
             return VisitAliasExpression((DbAliasExpression)dbExpression);
         case DbExpressionType.Concat:
             return VisitConcatExpression((DbConcatExpression)dbExpression);
         case DbExpressionType.Conditional:
             return VisitConditionalExpression((DbConditionalExpression)dbExpression);
         case DbExpressionType.Exists:
             return VisitExistsExpression((DbExistsExpression)dbExpression);
         case DbExpressionType.List:
             return VisitListExpression((DbListExpression)dbExpression);
         case DbExpressionType.Batch:
             return VisitBatchExpression((DbBatchExpression)dbExpression);
         case DbExpressionType.In:
             return VisitInExpression((DbInExpression)dbExpression);
         case DbExpressionType.Query:
             return VisitQueryExpression((DbQuery)dbExpression);
         case DbExpressionType.Join:
             return VisitJoinExpression((DbJoinExpression)dbExpression);
         case DbExpressionType.Unary:
             return VisitUnaryExpression((DbUnaryExpression)dbExpression);
         case DbExpressionType.OrderBy:
             return VisitOrderByExpression((DbOrderByExpression)dbExpression);
         case DbExpressionType.Prefix:
             return VisitPrefixExpression((DbPrefixExpression)dbExpression);
         case DbExpressionType.Sql:
             return VisitSqlExpression((DbSqlExpression)dbExpression);
     }
     throw new ArgumentOutOfRangeException(
         "dbExpression",
         string.Format("The expression type '{0}' is not supported", dbExpression.ExpressionType));
 }
Exemple #2
0
 /// <summary>
 /// Visits each node of the <see cref="DbExpression"/> tree checks
 /// if the current expression matches the predicate. If a match is found
 /// the expression will be replaced.
 /// </summary>
 /// <param name="expression">The <see cref="DbExpression"/> currently being visited.</param>
 /// <returns>The modified <see cref="DbExpression"/> tree.</returns>
 public override DbExpression Visit(DbExpression expression)
 {
     if (!expression.IsNull() && expression is TDbExpression)
     {
         if (_predicate((TDbExpression)expression))
         {
             return(_replaceWith((TDbExpression)expression));
         }
     }
     return(base.Visit(expression));
 }
        /// <summary>
        /// Visits each node of the <see cref="DbExpression"/> tree checks
        /// if the current expression matches the predicate.
        /// </summary>
        /// <param name="dbExpression">The <see cref="DbExpression"/> currently being visited.</param>
        /// <returns>A <see cref="DbExpression"/> instance.</returns>
        public override DbExpression Visit(DbExpression dbExpression)
        {
            if (!dbExpression.IsNull() && dbExpression.GetType() == typeof(TDbExpression))
            {
                if (_predicate((TDbExpression)dbExpression))
                {
                    _result.Add((TDbExpression)dbExpression);
                }
            }

            return(base.Visit(dbExpression));
        }
        /// <summary>
        /// Translates the <paramref name="selectExpression"/> into a string representation.
        /// </summary>
        /// <param name="selectExpression">The <see cref="DbSelectExpression"/> to translate.</param>
        /// <returns><see cref="string"/></returns>
        protected override DbExpression VisitSelectExpression(DbSelectExpression selectExpression)
        {
            if (!selectExpression.SkipExpression.IsNull())
            {
                return(BuildPagingStatement(selectExpression));
            }

            var          sb = new StringBuilder();
            DbExpression projectionExpression = selectExpression.ProjectionExpression;

            if (!projectionExpression.IsNull())
            {
                if (selectExpression.IsDistinct)
                {
                    sb.Append("SELECT DISTINCT ");
                }
                else
                {
                    sb.Append("SELECT ");
                }
                if (!selectExpression.TakeExpression.IsNull())
                {
                    sb.AppendFormat("TOP({0}) ", Visit(selectExpression.TakeExpression));
                }
                sb.AppendLine();
                sb.AppendFormat(1, "{0} ", Visit(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 (selectExpression.IsSubQuery)
            {
                return(ExpressionFactory.Sql(string.Format("({0})", sb.ToString().Trim())));
            }

            return(ExpressionFactory.Sql(sb.ToString().Trim()));
        }
        /// <summary>
        /// Visits each node of the <see cref="DbExpression"/> tree and rewrites the tree if any changes has been made to any of the child nodes.
        /// </summary>
        /// <param name="dbExpression">The <see cref="DbExpression"/> to visit.</param>
        /// <returns>A <see cref="DbExpression"/> instance.</returns>
        public virtual DbExpression Visit(DbExpression dbExpression)
        {
            if (dbExpression.IsNull())
            {
                return(dbExpression);
            }
            var expressionType = dbExpression.ExpressionType;

            switch (expressionType)
            {
            case DbExpressionType.Function:
                return(VisitFunctionExpression((DbFunctionExpression)dbExpression));

            case DbExpressionType.Select:
                return(VisitSelectExpression((DbSelectExpression)dbExpression));

            case DbExpressionType.Update:
                return(VisitUpdateExpression((DbUpdateExpression)dbExpression));

            case DbExpressionType.Insert:
                return(VisitInsertExpression((DbInsertExpression)dbExpression));

            case DbExpressionType.Delete:
                return(VisitDeleteExpression((DbDeleteExpression)dbExpression));

            case DbExpressionType.Column:
                return(VisitColumnExpression((DbColumnExpression)dbExpression));

            case DbExpressionType.Table:
                return(VisitTableExpression((DbTableExpression)dbExpression));

            case DbExpressionType.Binary:
                return(VisitBinaryExpression((DbBinaryExpression)dbExpression));

            case DbExpressionType.Constant:
                return(VisitConstantExpression((DbConstantExpression)dbExpression));

            case DbExpressionType.Alias:
                return(VisitAliasExpression((DbAliasExpression)dbExpression));

            case DbExpressionType.Concat:
                return(VisitConcatExpression((DbConcatExpression)dbExpression));

            case DbExpressionType.Conditional:
                return(VisitConditionalExpression((DbConditionalExpression)dbExpression));

            case DbExpressionType.Exists:
                return(VisitExistsExpression((DbExistsExpression)dbExpression));

            case DbExpressionType.List:
                return(VisitListExpression((DbListExpression)dbExpression));

            case DbExpressionType.Batch:
                return(VisitBatchExpression((DbBatchExpression)dbExpression));

            case DbExpressionType.In:
                return(VisitInExpression((DbInExpression)dbExpression));

            case DbExpressionType.Query:
                return(VisitQueryExpression((DbQuery)dbExpression));

            case DbExpressionType.Join:
                return(VisitJoinExpression((DbJoinExpression)dbExpression));

            case DbExpressionType.Unary:
                return(VisitUnaryExpression((DbUnaryExpression)dbExpression));

            case DbExpressionType.OrderBy:
                return(VisitOrderByExpression((DbOrderByExpression)dbExpression));

            case DbExpressionType.Prefix:
                return(VisitPrefixExpression((DbPrefixExpression)dbExpression));

            case DbExpressionType.Sql:
                return(VisitSqlExpression((DbSqlExpression)dbExpression));
            }
            throw new ArgumentOutOfRangeException(
                      "dbExpression",
                      string.Format("The expression type '{0}' is not supported", dbExpression.ExpressionType));
        }