Click here to Skip to main content
15,895,084 members
Articles / Database Development / SQL Server / SQL Server 2008

DbExpressions - A Step Towards Independency

Rate me:
Please Sign up or sign in to vote.
4.24/5 (12 votes)
2 Feb 2011CPOL9 min read 73.8K   317   18  
An abstract syntax tree implementation for SQL
using System;
using System.Collections.Generic;

namespace DbExpressions
{
    /// <summary>
    /// A class used to search for <see cref="DbExpression"/> instances. 
    /// </summary>
    /// <typeparam name="TDbExpression">The type of <see cref="DbExpression"/> to search for.</typeparam>
    public class DbExpressionFinder<TDbExpression> : DbExpressionVisitor where TDbExpression : DbExpression
    {
        private readonly IList<TDbExpression> _result = new List<TDbExpression>();
        private Func<TDbExpression, bool> _predicate;

        /// <summary>
        /// Returns a list of <typeparamref name="TDbExpression"/> instances that matches the <paramref name="predicate"/>.
        /// </summary>
        /// <param name="expression">The <see cref="DbExpression"/> that represents the sub tree for which to start searching.</param>
        /// <param name="predicate">The <see cref="Func{T,TResult}"/> used to filter the result</param>
        /// <returns>A list of <see cref="DbExpression"/> instances that matches the given predicate.</returns>
        public IEnumerable<TDbExpression> Find(DbExpression expression, Func<TDbExpression, bool> predicate)
        {
            _result.Clear();
            _predicate = predicate;
            Visit(expression);
            return _result;
        }


        /// <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><see cref="DbExpression"/></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);
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Norway Norway
I'm a 39 year old software developer living in Norway.
I'm currently working for a software company making software for the retail industry.

Comments and Discussions