lunes, 28 de octubre de 2013

Convertir consultas SQL a listas

En esta entrada voy a mostraros algunas de las formas que tengo para extraer datos de una fuente de datos SQL usando ADO.Net sin usar Entity Framework ni Linq2SQL.

Convertir un Dataset a Lista de objetos

 En este caso, tenemos un antiguo repositorio que nos devuelva un dataset a partir de un SQL. Podemos usar este método para convertirlo a un Enumerable y así poder adaptarlo a nuestras clases.

La clase que devuelve un DataSet

   public class DL_Datos  
   {  
     string connectionString="Persist Security Info=False;Integrated Security=TRUE;database=NorthWind;server=srvdesarrollo;Connect Timeout=60";  
     public DataSet DameDatos(string consulta)  
     {  
       SqlConnection conn = new SqlConnection(connectionString);  
       SqlDataAdapter da = new SqlDataAdapter(consulta, conn);  
       DataSet ds = new DataSet();  
       da.Fill(ds);  
       return ds;  
     }  
   }  

Nuestra clase

    public class Empleado
    {
        public int codigo { get; set; }
        public string nombre { get; set; }
        public string ciudad { get; set; }
        public string pais { get; set; }
    };

La conversión

        DL_Datos Sqldatos = new DL_Datos();  
       DataSet ds = Sqldatos.DameDatos("select EmployeeID, FirstName, LastName, City, Country from employees");  
       List<Empleado> empleados = ds.Tables[0]  
                     .AsEnumerable()  
                     .Select(dr => new Empleado()  
                     {  
                       codigo = dr.Field<int>("EmployeeID"),  
                       nombre = dr.Field<string>("FirstName") + " " + dr.Field<string>("LastName"),  
                       ciudad = dr.Field<string>("City"),  
                       pais = dr.Field<string>("Country")  
                     })  
                     .ToList();  

Convertir una consulta SQL a una lista de objetos

Otra forma de crear una lista directamente es crearnos un método extensor del Command que nos devuelva ya la lista montada

El método extensor

       public static void Fill<T>(this IDbCommand cmd, IList<T> list, Func<IDataReader, T> rowConverter)  
       {  
         using (var reader = cmd.ExecuteReader())  
         {  
           while (reader.Read())  
           {  
             list.Add(rowConverter(reader));  
           }  
         }  
       }  

Lo utilizaremos de esta manera:

       string connectionString = "Persist Security Info=False;Integrated Security=TRUE;database=NorthWind;server=srvdesarrollo;Connect Timeout=60";  
       using (SqlConnection conn = new SqlConnection(connectionString))  
       {  
         conn.Open();  
         SqlCommand comm = new SqlCommand("select EmployeeID, FirstName, LastName, City, Country from employees", conn);  
         List<Empleado> empleados = new List<Empleado>();  
         comm.Fill(empleados, r => new Empleado()  
         {  
           codigo = r.GetInt32(r.GetOrdinal("EmployeeID")),  
           nombre = r.GetString(r.GetOrdinal("FirstName")) + " " + r.GetString(r.GetOrdinal("LastName")),  
           ciudad = r.GetString(r.GetOrdinal("City")),  
           pais = r.GetString(r.GetOrdinal("Country"))  
         });  
         conn.Close();  
       }  

Convertir un DataSet a un Dictionary

       DL_Datos Sqldatos = new DL_Datos();  
       DataSet ds = Sqldatos.DameDatos("select regionID, regionDescription from Region");  
       Dictionary<int, string> dict = ds.Tables[0]  
           .AsEnumerable()  
           .ToDictionary(  
               x => x.Field<int>("regionID"),   
               x => x.Field<string>("regionDescription")  
               );  
Saludos.







No hay comentarios: