Datareader to ORM via reflection

Mapear ADO Datareader a objetos de ORM via reflection.

Datareader to ORM

  • Mapear Datareader to Linq Entity Object.
  • Mapear Datareader to Entity Framework Object.
  • Mapear Datareader to estándar ORM.

Existen varios métodos. Yo voy a exponer la reflexión.

Análisis de complejidad y perfomance.

Para quién no lo sepa, la reflexión es lenta por definición.
Para cada objeto que se pretende mapear con reflexión, se ha de iterar sobre los atributos / características de este objeto.

Esto supone iterar una colección,  un bucle como mínimo para cada objeto que se pretende mapear.

Es decir, en el mejor de los casos nuestro algoritmo de mapeo supone un coste de ejecución mínimo de un bucle de 1 hasta N, es decir una complejidad O(n). (Orden de N)

Estimar el peor caso es imposible ya que no se puede conocer la naturaleza de todos los objetos mapeables de ORM’s, y si así fuera, mañana podría salir uno nuevo.

Pero si podemos hacer una estimación media o estándar de un mapeo sobre objetos de ORM’s que reprensentan tablas de un motor de base de datos.

Mapeo sobre una base de datos relacional

Para una tabla de una base de datos relacional, digamos la tabla “personas”, nuestro proveedor crea un servicio que tenemos que consumir con DataReader, la reflexión nos servirá para mapear esta información a nuestra capa de datos.

Supongamos el ORM Linq To Sql, si en la tabla personas hay más de una persona, el mapeo constaría de una iteración para recorrer la lista de personas y otra iteración anidada para la reflexión  (suponiendo que no existen iteraciones exentas de esta clasificación motivadas por algún tipo de característica o pertenencia de la tabla personas).

Tendriamos una complejidad estándar de O(n2), (Orden de N cuadrado).

Código

cc = ConectionString

using (SqlConnection conn = new SqlConnection(cc)) {
	using (SqlCommand da = new SqlCommand(System.Data.sql, conn)) {
		conn.Open();
		listaReflexion = herramientas.MapearDataReader<persona>(da.ExecuteReader);
		conn.Close();
	}
}

 

public static List<T> MapearDataReader<T>(IDataReader dr) where T : new()
{
	Type businessEntityType = typeof(T);
	List<T> entitys = new List<T>();
	Hashtable hashtable = new Hashtable();
	PropertyInfo[] properties = businessEntityType.GetProperties();
	foreach (PropertyInfo info in properties) {
		hashtable[info.Name.ToUpper()] = info;
	}
	while (dr.Read()) {
		T newObject = new T();
		for (int index = 0; index <= dr.FieldCount - 1; index++) {
			PropertyInfo info = (PropertyInfo)hashtable[dr.GetName(index).ToUpper()];
			if ((info != null) && info.CanWrite) {
				info.SetValue(newObject, dr.GetValue(index), null);
			}
		}
		entitys.Add(newObject);
	}
	dr.Close();
	return entitys;
}

Conclusión:
Si se busca velocidad, dependiendo de la naturaleza de los datos está técnica puede resultar apropiada o no.

Si por el contrario queremos realizar una rápida integración, puede llegar a ser lo menos costoso.

Esta entrada fue publicada en ADO.NET, ASP .NET Webforms, DataReader, LINQ, Reflexión y etiquetada , , , . Guarda el enlace permanente.

Una respuesta a Datareader to ORM via reflection

  1. Felipe Furlan dijo:

    thanks a lot, works 100%

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *