Help with LinQ Method using group by Dynamic

1

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

In the case of backend I have the code below that returns exactly what I need, however, I really need to 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 in the controller as info1 and info2 . So in the place I pass the .Select instruction instead of being passed the way it is 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 doing this using IQueryAble as shown below, but I 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 this dynamic?

    
asked by anonymous 14.11.2018 / 20:10

1 answer

0

I tried in a number of ways, but I was only able to solve using if , since the condition I need is to access the properties during the group by / em>, which consisted of performing at object level, which presented errors when trying to use controller functions, as if they did not exist because they were out of scope. The solution was not in the best shape, let's say it's bad for maintenance, but that's what I was able to get it to work.

Here's how it went:

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();
    
20.11.2018 / 13:21