LINQ - PARAMETROS DINAMICOS

VERA.PALI 30/07/2022 11:53:53
#500267
Estamos acostumados com o padrão de criar uma função para um dado filtro e fazer a aplicação com base nos parametros.
        
public List<Cobranca> GetByDatasDescricaoClienteNomeTipoAndEstadoPaged(DateTime dataInicial, DateTime dataFinal, string descricaoContains, string clienteNomeContains, CobrancaTipo tipo, CobrancaEstado estado, Guid transacaoId, Guid clientePagamentosId, int start,int size)
{
return GetByDatasDescricaoClienteNomeTipoAndEstado(dataInicial, dataFinal, descricaoContains, clienteNomeContains, tipo, estado, transacaoId, clientePagamentosId).OrderByDescending(c => c.Vencimento).Skip(start).Take(size).ToList();
}

private IQueryable<Cobranca> GetByDatasDescricaoClienteNomeTipoAndEstado(DateTime dataInicial, DateTime dataFinal,string descricaoContains, string clienteNomeContains, CobrancaTipo tipo, CobrancaEstado estado, Guid transacaoId, Guid clientePagamentosId)
{
if (estado != CobrancaEstado.Todos && tipo != CobrancaTipo.Todos)
{
return db.Cobrancas.Include("Cliente").Include("Produto").Where(c => c.ClientePagamentosId == clientePagamentosId && c.Vencimento >= dataInicial && c.Vencimento <= dataFinal && c.Descricao.Contains(descricaoContains) && c.Cliente.Nome.Contains(clienteNomeContains) && c.Estado == (int)estado && c.Tipo == (int)tipo);
}
else if (estado != CobrancaEstado.Todos && tipo == CobrancaTipo.Todos)
{
return db.Cobrancas.Include("Cliente").Include("Produto").Where(c => c.ClientePagamentosId == clientePagamentosId && c.Vencimento >= dataInicial && c.Vencimento <= dataFinal && c.Descricao.Contains(descricaoContains) && c.Cliente.Nome.Contains(clienteNomeContains) && c.Estado == (int)estado);
}
else if (estado == CobrancaEstado.Todos && tipo != CobrancaTipo.Todos)
{
return db.Cobrancas.Include("Cliente").Include("Produto").Where(c => c.ClientePagamentosId == clientePagamentosId && c.Vencimento >= dataInicial && c.Vencimento <= dataFinal && c.Descricao.Contains(descricaoContains) && c.Cliente.Nome.Contains(clienteNomeContains) && c.Tipo == (int)tipo);
}
else if (transacaoId != Guid.Empty)
{
return db.Cobrancas.Include("Cliente").Include("Produto").Where(c => c.ClientePagamentosId == clientePagamentosId && c.Vencimento >= dataInicial && c.Vencimento <= dataFinal && c.Descricao.Contains(descricaoContains) && c.Cliente.Nome.Contains(clienteNomeContains) && c.Id == transacaoId);
}
else
{
return db.Cobrancas.Include("Cliente").Include("Produto").Where(c => c.ClientePagamentosId == clientePagamentosId && c.Vencimento >= dataInicial && c.Vencimento <= dataFinal && c.Descricao.Contains(descricaoContains) && c.Cliente.Nome.Contains(clienteNomeContains));
}
}


Porem isso vai crescendo de um tanto , e em um projeto que trabalhei no passado (nao tenho mais acesso) o pessoal criou um objeto Query/Filter e passavamos o where via esse processo
Assim como em outras linguagens, onde um array era passad com chave valor e usavamos campo = valor.
No Linq, como eu posso fazer para ter um List dinamico, eu vi que posso criar List<Expression> por exemplo...mas ele vai entender os lambdas la dentro ja que o objeto a ser explorado vem "depois"
KERPLUNK 31/07/2022 01:29:57
#500269
O que voce quer é um PredicateBuilder. Veja aqui
É meio complexo, já vou avisando.
WEBMASTER 01/08/2022 15:04:15
#500273
rsrsrs...
  var predicate = PredicateBuilder.False<Product>(); 


Ta com cara de ser meio complicado mesmo....
LEANDROVIP 01/08/2022 16:04:58
#500274
Olá,

Criei um projeto há um tempo para fazer isso, assim que eu conseguir vou subir no github e envio o link aqui

[]Â's
Faça seu login para responder