Help with Linq Method using group by Dinâmico

Asked

Viewed 44 times

1

I need to mount a dynamic graph from a filter panel and two fields select that can be crossed. I already have the structure that goes to the graph and how I need to return from backend.

In the case of backend I have the code below that returns exactly what I need, however, I need to actually return dynamically.

List<RetornoConsulta> result = context.Atendimentos.Where(x => x.dt_atendimento >= dt_inicio)
                            .Where(x => x.dt_atendimento <= dt_fim)
                            .Select(g => new {
                                categories = g.Pessoa.publico_prioritario.ToString(),
                                name = g.Pessoa.tp_nacionalidade
                            })
                            .GroupBy(g => new {
                                categories = g.categories,
                                name = g.name
                            })
                            .Select(g => new RetornoConsulta
                             {
                                 data = g.Count(),
                                 categories = g.Key.categories.ToString(),
                                 name = g.Key.name
                             }).ToList();
                    ViewBag.result = JsonConvert.SerializeObject(result);

As I said, I have to send two bank fields to be crossed, I get them on the controller as info1 and info2. Then on the site I pass the instruction of the .Select rather than being passed the way above, the variables info1 and info2 should function as the class attribute as follows:

.Select(g => new {
     categories = g.Pessoa.**[info1]**.ToString(),
     name = g.Pessoa.**[info2]**
 })

I had tried to do this using the Iqueryable as shown below, but could not:

    public List<Atendimento> getGraficoAtendimentos(DateTime dt_inicio, DateTime dt_fim, string nm_sas = "", 
                string nm_distrito = "", string tipologia = "", string servico = "", string info1 = "", string info2 = "")
            {
                var atendimentos = _context.Atendimentos.AsQueryable();

                atendimentos = atendimentos.Where(x => x.dt_atendimento >= dt_inicio);
                atendimentos = atendimentos.Where(x => x.dt_atendimento <= dt_fim);
                if (nm_sas != "") atendimentos = atendimentos.Where(x => DbFunctions.Like(x.Pessoa.Domicilio.nm_prefeitura_regional, "%" + nm_sas + "%"));
                if (nm_distrito != "") atendimentos = atendimentos.Where(x => DbFunctions.Like(x.Pessoa.Domicilio.nm_distrito, "%" + nm_distrito + "%"));
                if (tipologia != "") atendimentos = atendimentos.Where(x => x.Servico.Tipologia.id.ToString() == tipologia);
                if (servico != "") atendimentos = atendimentos.Where(x => x.Servico.id.ToString() == servico);

                switch (info1)
                {
                    case "tp_raca": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_raca).SelectMany(gr => gr);
                        break;
                    case "genero": atendimentos = atendimentos.GroupBy(x => x.Pessoa.genero).SelectMany(gr => gr);
                        break;
                    //case "faixa_etaria": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_raca).SelectMany(gr => gr);
                    //    break;
                    case "tp_nacionalidade": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_nacionalidade).SelectMany(gr => gr);
                        break;
                    case "publico_prioritario": atendimentos = atendimentos.GroupBy(x => x.Pessoa.publico_prioritario).SelectMany(gr => gr);
                        break;
                    case "tp_estado_civil": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_estado_civil).SelectMany(gr => gr);
                        break;
                    case "tp_grau_dependencia": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_grau_dependencia).SelectMany(gr => gr);
                        break;
                    case "in_deficiencia": atendimentos = atendimentos.GroupBy(x => x.Pessoa.in_deficiencia).SelectMany(gr => gr);
                        break;
                    case "in_filhos": atendimentos = atendimentos.GroupBy(x => x.Pessoa.in_filhos).SelectMany(gr => gr);
                        break;
                    default: break;
            }

            switch (info2)
            {
                    case "tp_raca": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_raca).SelectMany(gr => gr);
                        break;
                    case "genero": atendimentos = atendimentos.GroupBy(x => x.Pessoa.genero).SelectMany(gr => gr);
                        break;
                    //case "faixa_etaria": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_raca).SelectMany(gr => gr);
                    //    break;
                    case "tp_nacionalidade": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_nacionalidade).SelectMany(gr => gr);
                        break;
                    case "publico_prioritario": atendimentos = atendimentos.GroupBy(x => x.Pessoa.publico_prioritario).SelectMany(gr => gr);
                        break;
                    case "tp_estado_civil": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_estado_civil).SelectMany(gr => gr);
                        break;
                    case "tp_grau_dependencia": atendimentos = atendimentos.GroupBy(x => x.Pessoa.tp_grau_dependencia).SelectMany(gr => gr);
                        break;
                    case "in_deficiencia": atendimentos = atendimentos.GroupBy(x => x.Pessoa.in_deficiencia).SelectMany(gr => gr);
                        break;
                    case "in_filhos": atendimentos = atendimentos.GroupBy(x => x.Pessoa.in_filhos).SelectMany(gr => gr);
                        break;
                    default: break;
            }
            return atendimentos.ToList();
        }

So how could I make it dynamic?

1 answer

0


I tried several ways, but I could only solve using if ternary, because the condition I need is to access the properties during the group by of a select, which consisted of performing at the object level, which presented errors when trying to use controller functions, as if they did not exist because they were outside the scope. The solution was not in the best way, let’s say it is bad for maintenance, but it was what I managed to make work.

It goes down like it was:

List<RetornoConsulta> result = atendimentos.Where(x => x.dt_atendimento >= dt_inicio)
                    .Where(x => x.dt_atendimento <= dt_fim)
                    .Select(g => new {
                        categories = (info1 == "tp_raca" ? g.Pessoa.tp_raca.ToString() :
                                    (info1 == "genero" ? g.Pessoa.genero.ToString() :
                                    (info1 == "tp_nacionalidade" ? g.Pessoa.tp_nacionalidade.ToString() :
                                    (info1 == "publico_prioritario" ? g.Pessoa.publico_prioritario.ToString() :
                                    (info1 == "tp_estado_civil" ? g.Pessoa.tp_estado_civil.ToString() :
                                    (info1 == "tp_grau_dependencia" ? g.Pessoa.tp_grau_dependencia.ToString() :
                                    (info1 == "in_deficiencia" ? g.Pessoa.in_deficiencia.ToString() :
                                    (info1 == "in_filhos" ? g.Pessoa.in_filhos.ToString() :
                                    (info1 == "in_servico_acolhimento" ? g.Pessoa.in_servico_acolhimento.ToString() :
                                    (info1 == "in_situacao_escolar" ? g.Pessoa.in_situacao_escolar.ToString() :
                                    (info1 == "tp_modalidade_ensino" ? g.Pessoa.tp_modalidade_ensino.ToString() :
                                    (info1 == "tp_rede_ensino" ? g.Pessoa.tp_rede_ensino.ToString() :
                                    (info1 == "tp_grau_escolaridade" ? g.Pessoa.tp_grau_escolaridade.ToString() : ""))))))))))))),
                        name = (info2 == "tp_raca" ? g.Pessoa.tp_raca.ToString() :
                                (info2 == "genero" ? g.Pessoa.genero.ToString() :
                                (info2 == "tp_nacionalidade" ? g.Pessoa.tp_nacionalidade.ToString() :
                                (info2 == "publico_prioritario" ? g.Pessoa.publico_prioritario.ToString() :
                                (info2 == "tp_estado_civil" ? g.Pessoa.tp_estado_civil.ToString() :
                                (info2 == "tp_grau_dependencia" ? g.Pessoa.tp_grau_dependencia.ToString() :
                                (info2 == "in_deficiencia" ? g.Pessoa.in_deficiencia.ToString() :
                                (info2 == "in_filhos" ? g.Pessoa.in_filhos.ToString() :
                                (info2 == "in_servico_acolhimento" ? g.Pessoa.in_servico_acolhimento.ToString() :
                                (info2 == "in_situacao_escolar" ? g.Pessoa.in_situacao_escolar.ToString() :
                                (info2 == "tp_modalidade_ensino" ? g.Pessoa.tp_modalidade_ensino.ToString() :
                                (info2 == "tp_rede_ensino" ? g.Pessoa.tp_rede_ensino.ToString() :
                                (info2 == "tp_grau_escolaridade" ? g.Pessoa.tp_grau_escolaridade.ToString() : ""))))))))))))),
                    })
                    .GroupBy(g => new {
                        categories = g.categories,
                        name = g.name
                    })
                    .Select(g => new RetornoConsulta
                    {
                        data = g.Count(),
                        categories = g.Key.categories.ToString(),
                        name = g.Key.name.ToString()
                    }).ToList();

Browser other questions tagged

You are not signed in. Login or sign up in order to post.