|
<< Click to Display Table of Contents >> Filtros.cs |
![]() ![]()
|
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 = null, FiltrosOperador 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 = null, FiltrosOperador 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
}
}