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