C#  -  Carregando dados dinamicamente com LINQ usando Select New


 Neste artigo vou mostrar como carregar dados em um DataGridView usando uma consulta LINQ dinâmica que cria uma nova estrutura de dados usando Select new.

Com LINQ podemos usar uma expressão de consulta que pode criar uma nova estrutura de dados. Essa estrutura é composta de objetos compostos.

Com a cláusula Select New podemos criar novos objetos de um tipo anônimo como resultado de uma consulta de forma dinâmica. A criação é feita durante a avaliação da expressão usando Lazy Loading.

Lazy Load é o mecanismo utilizado para carregar informações sobre demanda. Esse mecanismo torna as entidades mais leves, pois suas associações são carregadas apenas no momento em que o método que disponibiliza o dado associativo é chamado. Assim quando objetos são retornados por uma consulta, os objetos relacionados não são carregados ao mesmo tempo, ao invés, eles são carregados quando a expressão de consulta é avaliada.  É também conhecido como "lazy loading".

No exemplo vamos mostrar um exemplo bem simples de como usar o recurso.

Carregando uma nova estrutura de dados com Select New

Vamos criar uma aplicação Windows Forms Application usando o Visual Studio 2015 Community com o nome CSharp_Dynamic_Linq1.

A seguir vamos criar uma classe Tarefa com o seguinte código:

    public class Tarefa
    {
        public string Nome { get; set; }
        public string Servico { get; set; }
        public string Descricao { get; set; }
        public DateTime Inicio { get; set; }
        public DateTime Fim { get; set; }
    }

Temos aqui uma simples classe POCO.

Agora no formulário padrão inclua um controle DataGridView (dgvTarefas) , um componente BindingSource(bsTarefa) e um Button(btnCarregar) :

Agora no evento Click do botão de comando vamos incluir uma chamada ao método carregarDados() que iremos implementar conforme o código a seguir:

        public void carregarDados()
        {
            List<Tarefa> listaTarefas = new List<Tarefa>()
            {
                new Tarefa() { Nome = "Calibração", Servico="Leitura", Inicio= DateTime.Now.AddDays(-2), 
                                       Fim = DateTime.Now.AddDays(-2), Descricao="Processo de calibração concluído sem erros"},
                new Tarefa() { Nome = "Alocação", Servico="Gravação", Inicio= DateTime.Now.AddDays(-2), 
                                       Fim = DateTime.Now.AddDays(-1), Descricao="Alocação remota de recursos realizada com delay de 50 minutos."},
                new Tarefa() { Nome = "Compra de Estoque", Servico="DataWarehousing", Inicio= DateTime.Now, 
                                       Fim = DateTime.Now, Descricao="Compra de produtos com transporte."}
            };
            var items = from dados in listaTarefas
                        select new
                        {
                            NomeOperacao = dados.Nome,
                            Inicio = dados.Inicio.ToShortDateString(),
                            Fim = dados.Fim.ToShortDateString(),
                            Operacao = dados.Servico,
                            Descricao = dados.Descricao
                        };
            bsTarefa.DataSource = items;
            dgvTarefas.DataSource = bsTarefa;
            // atributos do grid : estilo da borda e autosize
            dgvTarefas.BorderStyle = BorderStyle.Fixed3D;
            dgvTarefas.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
        }

O código cria uma lista de tarefas e a seguir usa uma consulta LINQ que extrai uma nova estrutura de dados a partir da lista de tarefas usando Select New.

O resultado é atribuído ao BindingSource que a seguir é atribuído ao DataGridView exibindo o resultado.

Executando o projeto teremos o seguinte resultado:

Nota:  O código VB .NET do método carregarDados() é dado a seguir:

    Public Sub carregarDados()
        Dim listaTarefas As New List(Of Tarefa)() From {
        New Tarefa() With {
                .Nome = "Calibração",
                .Servico = "Leitura",
                .Inicio = DateTime.Now.AddDays(-2),
                .Fim = DateTime.Now.AddDays(-2),
                .Descricao = "Processo de calibração concluído sem erros"
            },
            New Tarefa() With {
                .Nome = "Alocação",
                .Servico = "Gravação",
                .Inicio = DateTime.Now.AddDays(-2),
                .Fim = DateTime.Now.AddDays(-1),
                .Descricao = "Alocação remota de recursos realizada com delay de 50 minutos."
            },
            New Tarefa() With {
                .Nome = "Compra de Estoque",
                .Servico = "DataWarehousing",
                .Inicio = DateTime.Now,
                .Fim = DateTime.Now,
                .Descricao = "Compra de produtos com transporte."
            }
        }
        Dim items = From dados In listaTarefas
                    Select New With
                    {
                        .NomeOperacao = dados.Nome,
                        .Inicio = dados.Inicio.ToShortDateString(),
                        .Fim = dados.Fim.ToShortDateString(),
                        .Operacao = dados.Servico,
                        .Descricao = dados.Descricao
                    }
        bsTarefa.DataSource = items
        dgvTarefas.DataSource = bsTarefa
        ' atributos do grid : estilo da borda e autosize
        dgvTarefas.BorderStyle = BorderStyle.Fixed3D
        dgvTarefas.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    End Sub

 

Pegue o projeto aqui :  CSharp_Dynamic_Linq1.zip

"Verdadeiramente ele (Jesus) tomou sobre si as nossas enfermidades, e as nossas dores levou sobre si; e nós o reputávamos por aflito, ferido de Deus, e oprimido."
Isaías 53:4

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti