22/07/11

Convertire un DataTable in una collezione di oggetti tipizzata

Premesso che attualmente si è soliti utilizzare un ORM (Object Relational Mapper) per mappare gli oggetti alle tabelle SQL, alcune volte può capitare di avere applicazioni vecchie o con codice legacy e nelle quali viene utilizzato Ado.Net per effettuare le query verso il database.

La parte più onerosa si verifica quando effettuaiamo una query e ci viene restituito il risultato in un DataTable oppure un DataReader: bisogna instanziare una collezione di oggetti e valorizzarne le proprietà (una ad una).

Per ovviare a questo problema possiamo utilizzare una classe di helper; diamo per scontato che i campi del database si chiamano nello stesso modo delle proprietà


Ecco la clase di helper, è sufficiente chiamare il metodo passando a parametro il DataTable e ci verrà restituita una collezione di oggetti

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using MpsManager.Controllers.Helper;

namespace MpsManager.Models
{

    public static class MapDataAndBusinessEntityHelper
    {
        public static List MapDataToBusinessEntityCollection(DataTable dr)
        where T : new()
        {
            Type businessEntityType = typeof(T);

            var entitys = new List();

            var hashtable = new Hashtable();

            PropertyInfo[] properties = businessEntityType.GetProperties();

            foreach (PropertyInfo info in properties)
            {

                hashtable[info.Name.ToUpper()] = info;

            }

            foreach (DataRow dataRow in dr.Rows)
            {
                T newObject = new T();

                for (int index = 0; index < dr.Columns.Count; index++)
                {

                    var info = (PropertyInfo)hashtable[dr.Columns[index].ColumnName.ToUpper()];

                    if ((info != null) && info.CanWrite)
                    {

                        info.SetValue(newObject, dataRow[info.Name] is DBNull ? null : dataRow[info.Name], null);

                    }

                }

                entitys.Add(newObject);
            }
            return entitys;


        }

    }

}

0 commenti:

Posta un commento

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Grants For Single Moms