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