Filtros.cs

<< Click to Display Table of Contents >>

Navigation:  Persistencia > Persistencia > banco >

Filtros.cs

Previous pageReturn to chapter overviewNext page

using System;

using System.Linq.Expressions;

using System.Text;

using Modelo.classes;

 

namespace Persistencia.banco

{

    public enum FiltrosOperador { And, Or };

 

    public class Filtros

    {

        private StringBuilder sbFiltros;

 

        public Filtros()

        {

            sbFiltros = new StringBuilder();

        }

 

        /// <summary>

        /// adiciona um filtro para usar com select, use toString para pegar o filtro completo

        /// para os parâmetros abaixo, tenha por exemplo:

        /// Pessoa p = new Pessoa();

        /// Filtros f = new Filtros();

        /// f.Add(() => p.Nome, p, FiltroExpressao.ComecaCom, "M");

        /// </summary>

        /// <param name="exp">Propridade em formato expressão Lambda (() => x.Nome)</param>

        /// <param name="obj">Instância do objeto que contém a propriedade do primeiro parâmetro (ex: p)</param>

        /// <param name="expressao">FiltroExpressao.*</param>

        /// <param name="valorInicial">Valor para o filtro (100, "Maria", etc)</param>

        /// <param name="valorFinal">Valor para o filtro (100, "Maria", etc)</param>

        /// <param name="operador">FiltroOperador.And ou FiltroOperador.Or</param>

        public Filtros Add<T, O>(Expression<Func<T>> exp, O obj, FiltroExpressao expressao, object valorInicial, object valorFinal = nullFiltrosOperador operador = FiltrosOperador.And)

        {

            string campo = Auxiliar.GetFieldName(exp, obj);

            this.Add(campo, expressao, valorInicial, valorFinal, operador);

            return this;

        }

 

        /// <summary>

        /// Veja o outro overload para descrição e exemplo de uso.

        /// </summary>

        public Filtros Add(string campo, FiltroExpressao expressao, object valorInicial, object valorFinal = nullFiltrosOperador operador = FiltrosOperador.And)

        {

            Filtro filtro = new Filtro(campo, expressao, valorInicial, valorFinal);

            sbFiltros.Append(filtro.ToString());

            AdicionarOperador(operador);

            return this;

        }

 

        /// <summary>

        /// adiciona um "not" na frente da próxima expressão

        /// </summary>

        public Filtros AddNot()

        {

            sbFiltros.Append(" not ");

            return this;

        }

 

        /// <summary>

        /// abre um grupo de filtros, por exemplo você quer todos clientes que começam com X e tenho codigo > 100 -OU- começam com Z e código menor que 100

        /// então você tem 2 grupos:

        /// filtro.AddGrupo();

        /// filtro.Add(() => e.Nome, e, FiltroExpressao.ComecaCom, "X");

        /// filtro.Add(() => e.Id, e, FiltroExpressao.Maior, 100);

        /// f.FecharGrupo(FiltrosOperador.Or);

        /// filtro.AddGrupo();

        /// filtro.Add(() => e.Nome, e, FiltroExpressao.ComecaCom, "Z");

        /// filtro.Add(() => e.Id, e, FiltroExpressao.Menor, 100);

        /// f.FecharGrupo();

        /// </summary>

        public Filtros AbrirGrupo()

        {

            sbFiltros.Append("(");

            return this;

        }

 

        /// <summary>Veja AbrirGrupo()</summary>

        public Filtros FecharGrupo(FiltrosOperador operador = FiltrosOperador.And)

        {

            RemoverOperadorDoFinal();

            sbFiltros.Append(")");

            AdicionarOperador(operador);

            sbFiltros.Append("\n");

            return this;

        }

 

        /// <summary>Limpar os filtros [opcional]</summary>

        public void Clear()

        {

            sbFiltros.Clear();

        }

 

        /// <summary>Retorna os filtros em formato SQL</summary>

        public override string ToString()

        {

            RemoverOperadorDoFinal();

            return sbFiltros.ToString();

        }

 

        #region private

        // adiciona um operador, uso interno

        private void AdicionarOperador(FiltrosOperador operador)

        {

            switch (operador)

            {

                case FiltrosOperador.And: sbFiltros.Append(" and"); break;

                case FiltrosOperador.Or: sbFiltros.Append(" or"); break;

            }

        }

 

        // uso interno, remove o "and" ou "or" de lixo do final

        private void RemoverOperadorDoFinal()

        {

            if (sbFiltros.Length > 4)

            {

                string final = sbFiltros.ToString().Substring(sbFiltros.Length - 4, 4).Trim();

                if (final.Equals("and"))

                    sbFiltros.Remove(sbFiltros.Length - 4, 4);

                if (final.Equals("or"))

                    sbFiltros.Remove(sbFiltros.Length - 3, 3);

            }

        }

        #endregion

    }

}