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?