none
Pasar IEnumerable a Datatable RRS feed

  • Pregunta

  • Saludos, hay una forma de pasar este resultado a un datatble ?

      DataTable dt = new DataTable();
                dt.Columns.Add("id", typeof(Int32));
                dt.Columns.Add("descripcion", typeof(string));
                dt.Rows.Add(1, "descripcion 1");
                dt.Rows.Add(1, "descripcion 11");
                dt.Rows.Add(2, "descripcion 2");
                var result = dt.AsEnumerable().Where(myRow => myRow.Field<int>("id") == 1);
                dataGridView1.DataSource = result.ToList();

    sería algo como

    Datatable dt=new datatable

    dt=result as Datatable

    miércoles, 16 de agosto de 2017 15:47

Respuestas

Todas las respuestas

  • Si, se puede, pero no es sencillo, requiere un par de docenas de lineas de codigo. Esencialmente, lo que tienes que hacer es enumerar el IEnumerable con un bucle foreach, que te devolvera un object como variable de control del bucle (porque no sabes el tipo de dato que hay en el Enumerable). Entonces usas System.Reflection para enumerar las propiedades de ese Object. En la primera iteracion del bucle usas los PropertyInfo para crear las columnas del DataTable, y luego en todas las iteraciones (incluida la primera) usas el .GetValue del PropertyInfo para recuperar el valor de la propiedad del Object y meterla en el datatable. Al final del bucle tendras el datatable deseado. Si quieres, puedes hacer esto en un metodo de extension y llamarle por ejemplo ToDataTable, y eso te permite luego hacer dt=result.ToDatatable();.

    Hay varios ejemplos que circulan por la Red. Por ejemplo, aqui tienes uno:

    http://www.extensionmethod.net/1742/csharp/ienumerable-t/todatatable

    miércoles, 16 de agosto de 2017 16:11
    Moderador
  • Hola, lo que quieres es filtrar? Usa DataView.RowFilter para crear un filtro de tus datos cargados.

    DataTable dt = new DataTable();
    dt.Columns.Add("id", typeof(Int32));
    dt.Columns.Add("descripcion", typeof(string));
    dt.Rows.Add(1, "descripcion 1");
    dt.Rows.Add(1, "descripcion 11");
    dt.Rows.Add(2, "descripcion 2");
    
    // Crear DataView
    DataView dv = new DataView(dt); // también puedes hacer DataView dv = dt.DefaultView;
    dv.RowFilter = "id = 1";


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 16 de agosto de 2017 16:33
    Moderador
  • Hola:

     En este articulo muestran como lograrlo:

    Convert List<t>/IEnumerable to DataTable/DataView</t>

    <t> Yo personalmente lo he probado y funciona perfectamente.</t>


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 16 de agosto de 2017 17:08
  • hola

    tienes que usar el

    DataTableExtensions.CopyToDataTable()

    analiza el ejemplo del link, alli hace esto que necesitas de un linq obtiene el datatable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Augusto C sábado, 19 de agosto de 2017 15:52
    miércoles, 16 de agosto de 2017 17:24
  • Hola, lo que quieres es filtrar? Usa DataView.RowFilter para crear un filtro de tus datos cargados.

    DataTable dt = new DataTable();
    dt.Columns.Add("id", typeof(Int32));
    dt.Columns.Add("descripcion", typeof(string));
    dt.Rows.Add(1, "descripcion 1");
    dt.Rows.Add(1, "descripcion 11");
    dt.Rows.Add(2, "descripcion 2");
    
    // Crear DataView
    DataView dv = new DataView(dt); // también puedes hacer DataView dv = dt.DefaultView;
    dv.RowFilter = "id = 1";


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    Hola Sergio muchas gracias por tu respuesta , una consulta respecto a tu propuesta es Linq mas eficiente que los metodos propios del datatable para trabajar con datos como DataTable.Select  o el Dataview
    sábado, 19 de agosto de 2017 15:54
  • Hola. Los objetos DataTable y DataSet son objetos muy pesados. Siempre es más eficiente usar Linq con clases simples. Ahora bien, mi respuesta iba encaminada a que leyendo tu código he observado que una vez cargado el DataTable realizas un filtro. Estás haciendo doble trabajo(conviertes a Enumerable y luego filtras). Con DataView es más eficiente.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta Pedro Ávila domingo, 20 de agosto de 2017 17:39
    • Votado como útil Augusto C viernes, 25 de agosto de 2017 16:16
    domingo, 20 de agosto de 2017 7:18
    Moderador