none
Conversão de dados RRS feed

  • Pergunta

  • Olá,

    Existe alguma maneira simples de transformar um DataTable em uma Lista? Eu sei ler o DataTable e ir adicionando na lista, porem gostaria de saber se existe algo mais pratico, tipo converter o DataTable para qualquer tipo de Lista, passando somente o tipo de objeto (obj Pessoa, Cliente, Carro).

    Valeu!

    domingo, 7 de setembro de 2014 21:10

Respostas

  • Olá, você pode criar um classe com metodos genéricos para efetuar esta conversão

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Reflection;
    using System.Linq;
    
    
    namespace Algar.Security.Data.Helper
    {
        public class Converter
        {
            public List<T> ConvertTo<T>(DataTable datatable) where T : new()
            {
                List<T> Temp = new List<T>();
                try
                {
                    List<string> columnsNames = new List<string>();
                    foreach (DataColumn DataColumn in datatable.Columns)
                        columnsNames.Add(DataColumn.ColumnName);
                    Temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsNames));
                    return Temp;
                }
                catch
                {
                    return Temp;
                }
    
            }
            public T getObject<T>(DataRow row, List<string> columnsName) where T : new()
            {
                T obj = new T();
                try
                {
                    string columnname = "";
                    string value = "";
                    PropertyInfo[] Properties;
                    Properties = typeof(T).GetProperties();
                    foreach (PropertyInfo objProperty in Properties)
                    {
                        columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
                        if (!string.IsNullOrEmpty(columnname))
                        {
                            value = row[columnname].ToString();
                            if (!string.IsNullOrEmpty(value))
                            {
                                if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null)
                                {
                                    value = row[columnname].ToString().Replace("$", "").Replace(",", "");
                                    objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);
                                }
                                else
                                {
                                    value = row[columnname].ToString().Replace("%", "");
                                    objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);
                                }
                            }
                        }
                    }
                    return obj;
                }
                catch
                {
                    return obj;
                }
            }
        }
    }
    

    Depois você pode usar o método genérico ConverTo para retornar uma Lista de um tipo de objeto especifico passando como parâmetro o DataTable.

    Converter converter = new Converter();
    List<Usuario> usuarios = converter.ConvertTo<Usuario>(seuDataTable);


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli

    segunda-feira, 8 de setembro de 2014 18:29

Todas as Respostas

  • segunda-feira, 8 de setembro de 2014 10:47
  • É isso que eu estou usando em meu projeto, porém nesse caso eu preciso de um método para cada tipo de objeto, achei que existisse algo mais simples, onde eu passase o tipo de objeto e o datatable e retornava a lista do tipo de objeto passado, sacou?

    Mas valeu!

    segunda-feira, 8 de setembro de 2014 17:09
  • Olá, você pode criar um classe com metodos genéricos para efetuar esta conversão

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Reflection;
    using System.Linq;
    
    
    namespace Algar.Security.Data.Helper
    {
        public class Converter
        {
            public List<T> ConvertTo<T>(DataTable datatable) where T : new()
            {
                List<T> Temp = new List<T>();
                try
                {
                    List<string> columnsNames = new List<string>();
                    foreach (DataColumn DataColumn in datatable.Columns)
                        columnsNames.Add(DataColumn.ColumnName);
                    Temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsNames));
                    return Temp;
                }
                catch
                {
                    return Temp;
                }
    
            }
            public T getObject<T>(DataRow row, List<string> columnsName) where T : new()
            {
                T obj = new T();
                try
                {
                    string columnname = "";
                    string value = "";
                    PropertyInfo[] Properties;
                    Properties = typeof(T).GetProperties();
                    foreach (PropertyInfo objProperty in Properties)
                    {
                        columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
                        if (!string.IsNullOrEmpty(columnname))
                        {
                            value = row[columnname].ToString();
                            if (!string.IsNullOrEmpty(value))
                            {
                                if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null)
                                {
                                    value = row[columnname].ToString().Replace("$", "").Replace(",", "");
                                    objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);
                                }
                                else
                                {
                                    value = row[columnname].ToString().Replace("%", "");
                                    objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);
                                }
                            }
                        }
                    }
                    return obj;
                }
                catch
                {
                    return obj;
                }
            }
        }
    }
    

    Depois você pode usar o método genérico ConverTo para retornar uma Lista de um tipo de objeto especifico passando como parâmetro o DataTable.

    Converter converter = new Converter();
    List<Usuario> usuarios = converter.ConvertTo<Usuario>(seuDataTable);


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli

    segunda-feira, 8 de setembro de 2014 18:29