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

Linq em métodos de classes

Bom dia tenho uma classe DAO Inscrições em um projeto que ela liga pessoas e eventos numa consulta linq para retornar as inscrições

 public IList<Inscricao> Listar()
{
 var query = from i in context.Inscricoes
                        join e in context.Eventos
                        on i.IdEvento equals e.Id
                        join p in context.Pessoas
                        on i.IdPessoa equals p.Id
                        select new { i, e, p};

return query.ToList();
}

O meu problema é na hora do retorno do método ele não deixa eu passar um iList porque tem 3 tipos de retornos pessoas, eventos e inscrições como faço isso?

4 respostas

Olá Leonardo,

o problema é que ele não está sabendo criar os objetos Incricao dado que ele não sabe o que são cada um dos valores i, e, p em new { i, e , p}. Você precisa indicar para ele que no select vai dar um new em Inscricao e mapear esses valores. Aqui tem um link com um exemplo de como fazer isso.

Opa Lucas beleza?

Então olhei o exemplo que tu mandou, mas ali eles trabalham apenas com um Tipo.

Nessa consulta eu retorno 3 tipos, quando tento mapear para inscrição o VS da erro que a classe inscrição não tem o tipo digamos Nome do Evento

Eu teria que fazer a classe inscrição herdar de pessoas e eventos talvez?

Obs: Eu também não sei se esta abordagem esta certa com Linq de utilizar o método para retornar essa array de informações.

solução!

Só um cuidado com herança. Só criamos uma relação de herança entre duas classes quando existem a relação de É UM entre a classe pai e filha. Por exemplo, Inscrição É UMA Pessoa? Inscrição É UM Evento? Note como fica estranho porque inscrição não é nem pessoa e nem evento, por isso seria interessante evitar uma herança entre eles.

Neste caso, uma frase que faria mais sentido é que Inscrição TEM UMA Pessoa e TEM UM Evento. Quando a relação entre eles é de ter o outro, o que você faz é uma composição. Pelo query LINQ que você fez, notasse que por enquanto a Inscrição tem duas propriedade int de IdEvento e idPessoa. Mas com composição, você criaria em Inscrição uma propriedade do tipo Pessoa e outro do tipo Evento. Ai no select do seu Linq você pode atribuir o e na propriedade de Evento e o p na propriedade de Pessoa da Inscrição

Tipo achei um jeito de fazer mas não sei se é uma abordagem correta.

Criei uma classe na minha pasta de models com o nome de ViewInscritos e no metodo passo assim pois dentro dessa classe agora posso colocar os atributos que preciso passar

Como por exemplo o nome da pessoa, e o nome do Evento

 public IList<ViewInscritos> Listar()
        {
            var query = from i in context.Inscricoes
                        group i by i.Evento into agrupado
                        select new ViewInscritos
                        {
                            totalInscritos = agrupado.Count()
                        };

            return query.ToList();
        }

É correto fazer isso?