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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a
Objetos com VB .NET
C# - Gerando um Documento Excel a partir de um DataTable - Macoratti