Solucionado (ver solução)
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!