C# -  Exibindo mestre-detalhe com LINQ


Neste artigo veremos como exibir dados relacionados no formato mestre-detalhe usando uma consulta LINQ com Select new.

Uma consulta é uma expressão que recupera dados de uma fonte de dados. As consultas LINQ são muito versáteis e poderosas, e , todas as operações de consulta LINQ consistem em três ações distintas:

  1. Obter a fonte de dados.
  2. Criar a consulta.
  3. Executar a consulta.

Para mostrar sua versatilidade veremos um exemplo prática de utilização de uma consulta LINQ para obter dados relacionados.

recursos usados:

Criando o projeto no VS 2019 Community

Vamos criar um projeto usando a linguagem C# do tipo Console para .NET Core : Console App(.NET Core)

Podemos chamar o projeto de CShp_Linq1.

No projeto criado vamos incluir uma pasta Models e nesta pasta vamos criar 3 classes: Pedido, PedidoItem e SubItem

1- Pedido

using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace CShp_Linq1.Models
{
    public class Pedido
    {
        public Pedido()
        {
            Items = new ObservableCollection<PedidoItem>();
        }
        public string Codigo { get; set; }
        public ICollection<PedidoItem> Items { get; set; }
    }
}

2- PedidoItem

using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace CShp_Linq1.Models
{
    public class PedidoItem
    {
        public PedidoItem()
        {
            SubItens = new ObservableCollection<SubItem>();
        }
        public decimal Quantidade { get; set; }
        public decimal Preco { get; set; }
        public ICollection<SubItem> SubItens { get; set; }
    }
}

3- SubItem

using System;
namespace CShp_Linq1.Models
{
    public class SubItem
    {
        public DateTime Data { get; set; }
        public decimal Quantidade { get; set; }
        public string NomeCliente { get; set; }
    }
}

Nosso objetivo é exibir todos os dados destas classes em uma tabela conforme a figura abaixo:

CodigoPedido ItemPreco ItemQuantidade SubItemQuantidade SubItem.NomCliente
123 30 3 1 Cliente1
123 30 3 2 Cliente2
123 500 50 20 Cliente1
123 500 50 20 Cliente2
123 500 50 10 Cliente3

Este é um trabalho para o LINQ.

Abra o arquivo Program e inclua o código a seguir:

using CShp_Linq1.Models;
using System;
using System.Collections.ObjectModel;
using System.Linq;
namespace CShp_Linq1
{
    class Program
    {
        static void Main(string[] args)
        {
            Pedido pedido = new Pedido();
            pedido.Codigo = "123";
            pedido.Items.Add(new PedidoItem()
            {
                Preco = 30,
                Quantidade = 3,
                SubItens = new Collection<SubItem>()
                           {
                              new SubItem() { Data = DateTime.Now, Quantidade = 1, NomeCliente = "Cliente1" },
                              new SubItem() { Data = DateTime.Now, Quantidade = 2, NomeCliente = "Cliente2" }
                           }
            });
            pedido.Items.Add(new PedidoItem()
            {
                Preco = 500,
                Quantidade = 50,
                SubItens = new Collection<SubItem>()
                           {
                              new SubItem() { Data = DateTime.Now, Quantidade = 20, NomeCliente = "Cliente1" },
                              new SubItem() { Data = DateTime.Now, Quantidade = 20, NomeCliente = "Cliente2" },
                              new SubItem() { Data = DateTime.Now, Quantidade = 10, NomeCliente = "Cliente3" }
                           }
            });
            var tabela = from item in pedido.Items
                            from subItem in item.SubItens
                            select new
                            {
                             CodigoPedido = pedido.Codigo,
                             ItemPreco = item.Preco,
                             ItemQuantidade = item.Quantidade,
                             SubItemQuantidade = subItem.Quantidade,
                             SubItemNomeCliente = subItem.NomeCliente
                           };
            foreach(var info in tabela)
            {
                Console.WriteLine($"{info.CodigoPedido} \t {info.ItemPreco} \t {info.ItemQuantidade}
 \t {info.SubItemNomeCliente} \t {info.SubItemQuantidade}" );
            }
            Console.ReadLine();
        }
    }
}

A consulta LINQ usamos as duas entidades item e subitem e estamos criando uma nova estrutura de dados. Essa estrutura é constituída de objetos compostos.

Assim, usando a cláusula select new, criamos novos objetos de um tipo anônimo como resultado de uma consulta.

Executando o projeto iremos obter o resultado abaixo como esperado:

Pegue o código do projeto aqui : CShp_Linq1.zip

"Qual é mais fácil? Dizer ao paralítico: Estão perdoados os teus pecados, ou dizer: Levanta-te, toma o teu leito e anda?
Ora, para que saibais que o Filho do Homem tem sobre a terra autoridade para perdoar pecados — disse ao paralítico:  Eu te mando: Levanta-te, toma o teu leito e vai para tua casa."

Marcos 2:9-11

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti