3
respostas

GET utilizando LinQ

Olá , tenho 3 tabelas interligados com foreign key, gostaria de retornar um arquivo JSON , seguindo o padrão abaixo Utilizando LinQ:

Ex.

{  "id": 1,
    "Nome_Empresa: Alura,
    "pedidos": [
         {
            "id":1
            "Nome_Aluno":"Rafael",
            "ItensPedidos": [
                {
                    "Curso":"java",
                    "quantidade":"1",
                    "preço":100,00
                }
             ]
        }

Minhas classes:

public class PedidoGrupo
{

    [Key]
    public int Id;
    public String Nome_Empresa;
    public virtual List<Pedido> pedidos { get; set; }


public class Pedidos
{

    [Key]
    public int Id;
    [ForeignKey("pedidoGrupo")]
    public int id_pedido_grupo 
    public String Nome_Aluno;
    public virtual PedidoGrupo pedidoGrupo { get; set; }
    public List<PedidoItem> pedidoItens { get; set; }
}


public class PedidoItem  
{

    [Key]
    public int id;
    [ForeignKey("Pedido")]
    public int id_pedido { get; set; }
    public virtual Pedido Pedido { get; set; }

ou seja, vou comparando os id's semelhantes e quero retornar um array de objetos dentro de PedidosItens que está dentro de pedidos, que por sua vez esta dentro de PedidosGrupo.

Qual a maneira correta de se fazer isso ? Estou com difculdade.

3 respostas

Olá, Rafael!

Abaixo coloquei o código usando a biblioteca Newtonsoft.Json (baixe do NuGet) para serializar o objeto PedidoGrupo, gerando uma string JSON.

(note que no meu teste eu removi os atributos [Key], [ForeignKey], etc, mas você não deve removê-los do seu código)

Agora, como você está usando Entity Framework, pode postar aqui o código que está usando para obter o pedido grupo (algo como var pedidoGrupo = Contexto.PedidoGrupo.Where(pg => pg.Id = 1).SingleOrDefault()?

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            var pedidoGrupo = new PedidoGrupo
            {
                Id = 1,
                Nome_Empresa = "Alura",
                pedidos = new List<Pedido>
                {
                    new Pedido
                    {
                        Id = 1,
                        Nome_Aluno = "Rafael",
                        pedidoItens = new List<PedidoItem>
                        {
                            new PedidoItem
                            {
                                Curso = "java",
                                Quantidade = 1,
                                Preco = 100
                            }
                        }
                    }
                }
            };

            var json = JsonConvert.SerializeObject(pedidoGrupo);
            Console.Write(json);
            Console.ReadKey();
        }
    }

    public class PedidoGrupo
    {
        public int Id;
        public String Nome_Empresa;
        public virtual List<Pedido> pedidos { get; set; }
    }

    public class Pedido
    {
        public int Id;
        public int id_pedido_grupo;
        public String Nome_Aluno;
        public virtual PedidoGrupo pedidoGrupo { get; set; }
        public List<PedidoItem> pedidoItens { get; set; }
    }

    public class PedidoItem
    {
        public int id;
        public int id_pedido { get; set; }
        public virtual Pedido Pedido { get; set; }
        public string Curso { get; set; }
        public int Quantidade { get; set; }
        public decimal Preco { get; set; }
    }
}

Eu fiz dessa maneira o método GET, mas não estou nem guardando na list o pedidos e pedidos itens.

public object ListarPorId(int IdGrupo)
       {
           PedidosContext contextPedidos = new PedidosContext();

           var PedidoGrupo = (from pedidoGrupo in contextPedidos.PedidoGrupos
                              where pedidoGrupo.id.Equals(IdGrupo)

                                       select new
                                       {
                                           pedidoGrupo.id,
                                           pedidoGrupo.Nome_empresa,
                                           pedidos = (from pedido in contextPedidos.Pedidos
                                                      where pedido.id_pedido_grupo == pedidoGrupo.id
                                                      select new
                                                      {
                                                          pedido.id,
                                                          pedido.Nome_Aluno,
                                                          pedido.id_pedido_grupo,
                                                          pedidoItens = (from pedidoitem in contextPedidos.PedidoItens
                                                                         where pedidoitem.id_pedido == pedido.id
                                                                         select new
                                                                         {
                                                                             pedidoitem.id,
                                                                             pedidoitem.id_pedido,
                                                                             pedidoitem.curso,
                                                                             pedidoitem.quantidade,
                                                                             pedidoitem.preco
                                                                         })
                                                      })
                                       });

            return listaDePedidosGrupo;
        }

Qual seria a maneira correta ?