Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Como retornar com LINQ registros que montem um select ?

Tenho o seguinte model chamado Cidade, ja configurei o Contexto do EF


        public string Codigo { get; set; }

        public string Nome { get; set; }

        public string Regional { get; set; }

        public string Uf { get; set; }

        public string Regiao { get; set; }

Gostaria de montar um SelectList que tenha o valor e o nome como campo de Regional, como fazer isso no LINQ ?

Estava tentando:

db.Cidades.GroupBy(c => c.Regional);

Mas não funciona, quando vou debugar a consulta que aparece é um select normal sem groupby

5 respostas
solução!

Olá, Breno!

Veja se funciona desta forma:

db.Cidades.GroupBy(c=> c.Regional)
     .Select(group => new { Regional = group.Key, Items = group.ToList() })
     .ToList()

Oi Marcelo, obrigado pela ajuda, vou testar e dar um retorno, mas tenho umas duvidas..

O GroupBy tem que ser usado com o Select, se sim pq ?

O que é o atributo key ?

Esse group que é usado como parametro é 1 registro da tabela ou é o conjunto de linhas da tabela ? Pergunto isso por questão do toList().

Obrigado pela atenção.

Olá, Breno!

O GroupBy tem que ser usado com o Select, se sim pq ?

O select vai "filtrar" e "transformar" os dados de origem para retornar os dados no formato que você quiser.

O que é o atributo key ?

É o resultado da expressão lambda dentro do GroupBy(), no caso, o Regional: c=> c.Regional

Esse group que é usado como parametro é 1 registro da tabela ou é o conjunto de linhas da tabela ? Pergunto isso por questão do toList().

Como interpretamos este código?

.Select(group => new { Regional = group.Key, Items = group.ToList() })
     .ToList()
  • A expressão new { Regional = group.Key, Items = group.ToList() vai gerar um objeto de tipo anônimo com 2 propriedades: Regional (que está agrupada) e Items, que é uma lista de todas as cidades dessa Regional.
  • O método ToList vai retornar uma lista de regionais, além de uma lista interna para cada regional, representando as cidades dessa regional.

Oi Marcelo, desculpe a demora, tentei realizar a alteração conforme informado mas agora ele me da uma excessão e não compila:

Não é possivel converter implicitamente tipo "System.Generic.List<<anonymous type: string Regional, System.Collections.Generic.LIst<OSPTL.Models.Cidade>Items>>" em System.Collections.generics>Ilist<OSPTL.Models.Cidade>. Existe uma conversão explicita

O codigo da função esta assim:

public IList<Cidade> ListarRegionais()
        {
            return db.Cidades.GroupBy(c => c.Regional)
                     .Select(group => new { Regional = group.Key, Items = group.ToList() })
                     .ToList();
        }

Só pra informar que consegui fazer o que precisa, percebi que o tipo do retorno da função não estava compatível com o retorno que estava solicitando, então fiz da seguinte maneira:

Criei uma entidade para representar as Regionais com apenas dois campos Id e Descrição, ambos string, e criei um DAO para ele também. Chamei a função do DAO para buscars os registros e montei o select na view. o código ficou assim:

Entidade

 public class Regional
    {
        public string Id { get; set; }

        public string Descricao { get; set; }
    }

DAO

public class RegionalDAO
    {
        private Contexto db;

        public RegionalDAO(Contexto contexto)
        {
            this.db = contexto;
        }

        public IList<Regional> ListarPares()
        {
            return db.Cidades.GroupBy(c => c.Regional)
                     .Select(group => new Regional { Id = group.Key, Descricao = group.Key })
                     .ToList();
        }
    }

Controller

public ActionResult Index()
        {

            ViewBag.selectRegionais = regionalDAO.ListarPares();

            return View();
        }

View

 <div class="col-md-2 col-xs-12">
                            @Html.LabelFor(p => p.Regionais, "Regionais:")
                            @Html.DropDownListFor(p => p.Regionais, new SelectList(ViewBag.selectRegionais, "Id", "Descricao"), new { @class="form-control"})
                            @Html.ValidationMessageFor(p => p.Regionais)
                        </div>

E pra auxiliar coloquei a entidade Regional na minha ViewModel de pesquisa

    public IEnumerable<Cidade> Cidades { get; set; }

        public IEnumerable<Regional> Regionais { get; set; }

Não sei se foi a melhor forma , mas resolveu, obrigado pela ajuda Marcelo.