LINQ - PARAMETROS DINAMICOS

 Tópico anterior Próximo tópico Novo tópico

LINQ - PARAMETROS DINAMICOS

C#

 Compartilhe  Compartilhe  Compartilhe
#500267 - 30/07/2022 11:53:53

VERAPALI
CURITIBA
Cadast. em:Dezembro/2003


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'


Vera Lucia


#500269 - 31/07/2022 01:29:57

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe

Última edição em 31/07/2022 01:32:43 por KERPLUNK

O que você quer é um PredicateBuilder. Veja aqui
É meio complexo, já vou avisando.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#500273 - 01/08/2022 15:04:15

WEBMASTER
CURITIBA
Cadast. em:Janeiro/2001


Membro da equipe
rsrsrs...
  var predicate = PredicateBuilder.False<Product>();


Ta com cara de ser meio complicado mesmo....

WebMaster - VBMania

Nao me mande e-mail com duvidas
Para isso e que existe o forum do VBMania !!!

#500274 - 01/08/2022 16:04:58

LEANDROVIP
VIRADOURO
Cadast. em:Agosto/2009


Olá,

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

[]´s

_______________________________________________________
Estamos aqui para fazer alguma diferena no universo, se no, porque estar aqui?
Steve Jobs


 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário