LINQ - Preenchendo um DataTable a partir de outro DataTable


 Neste artigo vou mostrar como podemos preencher um DataTable a partir de outro DataTable usando o LINQ e a linguagem C#.

Podemos preencher um DataTable a partir de outro DataTable usando LINQ de maneira bem simples.

Isso seria útil se você precisasse executar alguma operação no DataTable usando o LINQ e recuperar o resultado em outra 'DataTable'. Significa que você pode filtrar e projetar em uma DataTable e obter o resultado em outra DataTable.

Podemos conseguir isso usando o método 'CopyToDataTable' da variável de resultado da consulta LINQ.

No exemplo vamos criar uma aplicação Windows Forms e gerar um DataTable a partir do banco de dados Northwind.mdf do SQL Server para a seguir copiar o DataTable e exibir os dados.

Então vamos ao que interessa...

Recursos Usados:

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um projeto usando o template Windows Classic Desktop -> Windows Forms App com o nome WF_LinqDataTable;

No formulário padrão inclua os controles :

Definindo o código do formulário

Defina no formulário uma variável privada para criar uma instância de um DataTable que vamos usar para preecher com dados.

 private DataTable dataTable = new DataTable();

No evento Click do botão - btnCarregarDados - inclua o código abaixo:

       private void btnCarregarDados_Click(object sender, EventArgs e)
        {
            try
            {
                CarregaDados();
                btnCopiarDataTable.Enabled = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
        }

O código do método CarregaDados() é dado a seguir:

         public void CarregaDados()
        {
            try
            {
                string connString = @"Data Source=MACORATTI;Initial Catalog=Northwind;Integrated Security=True";
                string query = "Select CategoryID, CategoryName, Description from Categories";
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand(query, conn);
                conn.Open();
                // cria um data adapter
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                // preenche o datatable
                da.Fill(dataTable);
                conn.Close();
                da.Dispose();
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

Este código define a string de conexão local com o banco de dados Northwind e a consulta SQL para retornar os dados da tabela Categories.

Cria um DataAdapter e preenche o DataTable com dados.

No evento Click do botão - btnCopiarDataTable - vamos copiar os dados deste datatable e exibir os dados no DataGridView:

         private void btnCopiarDataTable_Click(object sender, EventArgs e)
        {
            if (dataTable != null)
            {
                var obj = (from m in dataTable.AsEnumerable() where m.Field<int>("CategoryID") > 1 select m);
                DataTable dt = obj.CopyToDataTable();
                dgvDados.DataSource = dt;
            }
            else
            {
                MessageBox.Show("Não existem dados...");
            }
        }

Neste código, na consulta LINQ usamos o método DataTable.AsEnumerable  que retorna um objeto IEnumerable<T> no qual o parâmetro genérico é um DataRow, pois o DataTable não implementa a inteface IEnumerable nem IQueryable usados pela consulta LINQ como uma fonte na cláusula from.

A seguir usamos o método CopyDataTable que retorna um DataTable que contém cópias dos objetos DataRow, dado um objeto IEnumerable<T> de entrada em que o parâmetro genérico T é um DataRow.

Agora é só alegria...

Executando o projeto teremos o seguinte resultado:

Pegue o projeto aqui :   WF_LinqDataTable.zip  (sem as referências)

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