Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Consultar 3 tabelas ligadas e retornar um objeto Json

Porque não consigo guardar a tabela dentro da lista que eu instanciei na outra classe, os itens ( pedidoGrupo.pedidos e pedidoGrupo.pedidos) acusam erro. Qual seria a maneira correta de retornar o objeto Json logo abaixo ?

   var PedidoGrupo = (from pedidoGrupo in ctx.PedidoGrupos
                              where pedidoGrupo.id.Equals(Id)

                                       select new
                                       {
                                           pedidoGrupo.Nome,
                                          **pedidoGrupo.pedidos** = (from pedido in ctx.Pedidos
                                                                 where pedido.id_pedido_grupo == pedidoGrupo.id
                                                         Select new
                                                         {
                                                          pedido.Destino,
                                                        **pedido.ItensPedidos** = (from pedidoitem in ctx.PedidoItens
                                                                         where pedidoitem.id_pedido == pedido.id
                                                                         select new
                                                                         {

                                                                              pedidoitem.Produto,
                                                                             pedidoitem.marca,
                                                                            pedidoitem.modelo,





}
{  "id": 1,
"Nome": "Rafael",
"pedidos": [{"id":1
            "Destino":"SaoPaulo"
            "ItensPedidos": [{"Produto":"celular",
                             "marca":"Apple",
                             "modelo":"Iphone7"
            }
         ]
    }
10 respostas

Me parece que você esqueceu de algumas " , " na parte de pedidos no Json. e também na sua função parece que você está esquecendo de fechar o {, a não ser que você postou apenas uma parte do codigo.

Só postei um exemplo do código mesmo. Na verdade só queria saber pq não consigo guarda a tabela no itens pedidoGrupo.pedidos e pedido.ItensPedidos. Segue minhas classes

public class PedidoGrupo{

    int id ;
    string nome ;
    public virtual List<Pedido> pedidos ;

}

    Public class Pedido{

    int id ;
    int id_PedidoGrupo;
    string destino;
    public virtual List<Pedido> ItensPedidos ;

}

    Public class PedidoItem{

    int id ;
    int id_Pedido;
    string produto;
    string marca;
    string modelo;


}

Sabe me dizer o erro que está ocorrendo a mensagem que ele retorna ao criar o Json.

Você sabe uma maneira de retornar o Json daquele jeito. seguindo essas minhas classes ?

Olá, Rafael!

Precisamos de algumas informações pra analisarmos melhor.

1) Estes asteriscos estão mesmo no seu código, ou você colocou só pra destacar?

**pedidoGrupo.pedidos**

2) Que erro está ocorrendo? Pode postar aqui o stack trace pra gente?

Obrigado!

Oi marcelo,

1) Os asterisco só coloquei para destacar.

2) Aparece o seguinte erro:

List ctx.pedidos

Declarador de membro de tipo anonimo invalido . Membro de tipo anonimo devem ser declarados com uma atribuição de membro , nome simples ou acesso de membro.

Um arvore de expressão não pode conter um operador de atribuição.

Qual seria a maneira correta de retornar essa consulta?

Ah, é um problema fácil de resolver!

Errado:

from pedidoGrupo in ctx.PedidoGrupos
where pedidoGrupo.id.Equals(Id)
select new
{
    pedidoGrupo.Nome, 
    //ok, aqui você está acessando o GET da propriedade Nome

    pedidoGrupo.pedidos = ... 
    //ERRADO! você está tentando acessar o SET de pedidos e tentando atribuir um valor numa consulta LINQ!

Correto

from pedidoGrupo in ctx.PedidoGrupos
where pedidoGrupo.id.Equals(Id)
select new
{
    pedidoGrupo.Nome,
    //ok, aqui você está acessando o GET da propriedade Nome

    pedidos = ...
    //CORRETO! agora você não está mais acessando o SET de pedidos, mas sim criando uma nova
    //propriedade para o objeto de tipo anônimo

Ou seja, se estamos usando LINQ para consultar objetos, podemos consultar suas propriedades, mas não podemos atribuir novos valores às suas propriedades.

Boa sorte e bons estudos!

Entendi qualquer nome que eu colocar no lugar funciona. Eu não estou guardando no

public virtual List<Pedido> pedidos

mas tenho outra dúvida, teria uma maneira melhor de fazer isso ?

solução!

Sim, existe uma maneira bem mais simples: substituindo as subconsultas pelo acesso às propriedades de navegação (isto é, aproveite que um PedidoGrupo tem uma propriedade Pedidos, que um Pedido tem ItensPedidos, etc.). Isso deixa o código mais enxuto e simples de ler:

var PedidoGrupo = 
( from pedidoGrupo in ctx.PedidoGrupos
 where pedidoGrupo.id.Equals(Id)
 select new
  {
   pedidoGrupo.Nome,
   pedidos =  
      from pedidoGrupo.pedidos
      select new
       {
        pedido.Destino,
        ItensPedidos = 
            from pedido.ItensPedidos
            select new
             {
              Produto,
              marca,
              modelo,
             }
       }
  }
);

Obrigado!