Asp.net

Todo sobre asp.net Web Forms

IEnumerable a DataSet, Extension Method

Mientras realizaba refactoring en el código base del framework de la compañía que laboro, me surgió la necesidad de transformar una lista genérica List<Objeto> en un DataSet. El código ha sido heredado desde hace algún tiempo y resultaba complicado modificar algunas collecciones customizadas que se realizaron para el proyecto.

Además las aplicaciones futuras necesitan la funcionalidad, bastante útil en tareas administrativas, de transformar una colección a DataSet. Pues encontré algunas fuentes interesantes de información: CodeProject presenta una alternativa bastante interesante, Keith Elder y Sunil Kumar Saini hacen algo similar y hasta StackOverflow está lleno de preguntas al respecto.

Pues yo me quedo con un artículo publicado por Ian Dikes, quien ha creado un método extendido para el objeto IEnumerable que nos permitirá transformar cualquier lista que implemente esta interfaz (IEnumerable) a DataSet.

El método es bastante simple y tomado de base de Keith Elder y su post: Obtener las propiedades y sus tipos, armar el dataset y popularlo para devolverlo luego.... Me tomaré la libertad de copiar el código para compartirlo con todos.

public static class CollectionExtensions
{
public static DataSet ToDataSet(this
IEnumerable collection, string dataTableName)
{
if (collection == null)
{
 throw new ArgumentNullException("collection");
}

if (string.IsNullOrEmpty(dataTableName))
{
 throw new ArgumentNullException("dataTableName");
}

DataSet data = new DataSet("NewDataSet");
data.Tables.Add(FillDataTable(dataTableName, collection));
return data;
}

private static DataTable FillDataTable(string tableName,
IEnumerable collection)
{
PropertyInfo[] properties = typeof(T).GetProperties();

DataTable dt = CreateDataTable(tableName,
collection, properties);

IEnumerator enumerator = collection.GetEnumerator();
while (enumerator.MoveNext())
{
 dt.Rows.Add(FillDataRow(dt.NewRow(),
enumerator.Current, properties));
}

return dt;
}

private static DataRow FillDataRow(DataRow dataRow,
T item, PropertyInfo[] properties)
{
foreach (PropertyInfo property in properties)
{
 dataRow[property.Name.ToString()] = property.GetValue(item, null);
}

return dataRow;
}

private static DataTable CreateDataTable(string tableName,
IEnumerable collection, PropertyInfo[] properties)
{
DataTable dt = new DataTable(tableName);

foreach (PropertyInfo property in properties)
{
 dt.Columns.Add(property.Name.ToString());
}

return dt;
}  
}

Recibe el nombre de la tabla a crear, inclusive se podría modificar para incluir el nombre del DataSet, yo no lo necesitaba. Ahora solo basta invocar el método ToDataSet en cualquier objeto que implementa IEnumerable para obtener el DataSet.

Happy Coding

Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

  1. Gekko

    Carta abierta al equipo de BlogIT y a nuestros usuarios

    Estimados usuarios, visitantes y gente de BlogIT Team, nos vemos forzados a dar a conocer públicamente nuestro desacuerdo con el sistema de votaciones, hemos estado analizando posible fraude en los votos.

    Nuestras sospechas tienen varios fundamentos que vamos a comentar a continuación, nuestro blog participa en la categoría "Clientes de Windows" resulta que han sucedido cosas "Muy raras y Obvias" esta ultima semana...

    Nuestro blog competidor mas cercano asteroide23.blogspot.com lo hemos seguido muy de cerca y resulta muy llamativo en como se dieron las votaciones.

    Se supone que las votaciones deben darse de manera gradual y paulatinamente durante el transcurso de un día, lo raro es que todas se producían entre las 02.00 am y 05.00 am (Horario Buenos Aires) una atras de la otra, era increíble pulsar f5 y ver como aumentaban.

    Otra cosa que hemos discutido con nuestro equipo es que en ese periodo también aumentaban las nuestras y en las estadísticas del hosting nuestro no aparecían rastros de trafico como para tantas votaciones. Pensamos que nos inflaron también con votos hechos con cuentas de e-mail falsas por si lo descalifican a ellos también se llevan a otros concursantes, ya que hubo un largo periodo para recibir votos y este blog asteroide23.blogspot.com recibió mas de 120 votos en solo 3 horas, el día viernes ¿No es sospechoso?

    Otros datos importantes, tiene solo 3 seguidores y no esta muy bien posicionando en google, ¿Como le hicieron acaparan así los votos tan rápido?

    Rogamos e imploramos que se apliquen los controles pertinentes, que se analice a full, verifiquen las cuentas y las IP de procedencia de los votos y se tome la mejor decisión posible.

    Confiamos en la profesionalidad de todos ustedes. No nos importa quedar afuera del concurso por promover toda esta bataola pero tampoco vamos a permitir que se pisotee a la gente y todos los demás concursantes, que inviertieron algo que no se puede comprar que es el tiempo ademas que es un atropello a la confianza y a los valores éticos.

    Quedando a la espera de la mejor decisión que puedan llegar a tomar.

    El equipo de Windows Beta!

Deja tu Comentario

© Devlixir.com : blog de desarrollo web en espanol, asp.net mvc nhibernate — theme design by Javier Romero.
Javier Romero.