Convertir método Datatable a Lista genérica

publicado por: Anonymous

Estoy trabajando con Entity Framework code firts en una app Windows Forms, tengo la necesidad de hacer esto:

public static DataTable SelectDT(PersonalCriteria filter)
    {
        using (SqlConnection cn = Conexion.Conectar("default"))
        {
            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandText = @"SELECT Codigo AS Código, Nombre AS Descripción FROM Personal
                WHERE((@Codigo IS NULL) OR (Codigo LIKE '%' + @Codigo + '%'))
                AND ((@Nombre IS NULL) OR (Nombre LIKE '%' + @Nombre + '%'))";

                cmd.Parameters.AddWithValue("@Codigo", string.IsNullOrEmpty(filter.Codigo)
                    ? (object)DBNull.Value
                    : filter.Codigo);
                cmd.Parameters.AddWithValue("@Nombre", string.IsNullOrEmpty(filter.Nombre)
                    ? (object)DBNull.Value
                    : filter.Nombre);
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    return dt;
                }
            }
        }
    }

Como lo haría usando linq, tengo mi Contex.

Si hago el método que sugiere @LeandroTuttini con una lista, podría hacer lo siguiente:
Tengo una DataTable declarado a nivel de formulario para poder usarlo en el método txtDescripcion_TextChanged

case 112: // Cliente
                if (flag == 1)
                {
                    ClienteCriteria filter = new ClienteCriteria()
                    {
                        Codigo = Helper.DatosTablaInputbox.Valor,
                    };
                    dt = Cliente.SelectDT(filter);
                    ds.Tables.Add(dt);
                    dgvBusqueda.DataSource = dt;
                    FormatoGrilla();
                }

Método, TextChanged

private void txtDescripcion_TextChanged(object sender, EventArgs e)
    {
        string fieldName = dt.Columns[1].ColumnName;
        dt.DefaultView.Sort = fieldName;
        DataView view = dt.DefaultView;
        view.RowFilter = string.Empty;
        if (txtDescripcion.Text != string.Empty)
            view.RowFilter = fieldName + " LIKE '%" + txtDescripcion.Text + "%'";
        dgvBusqueda.DataSource = view;
    }

Lo que hago es cargar el DataGridView con datos con el método que convertistes a Linq, una vez cargados lo que hago es filtrar en el objeto DGV.

Se podría hacer con una lista genérica o un IEnumerable reemplazar todo, una vez intente hacerlo pero no pude en la parte del evento del TextBox.

solución

Podrias hacerlo sin problemas armanndo una estructura similar pero con los parametros como nulos para permitir que sean opcionales

public List<Personal> GetPersonal(int? codigo, string nombre)
{
    using(DbContext context = new DbContext())
    {
        var result = (from p in context.Personal
                     where ((!codigo.HasValue) || (p.Codigo.Contains(codigo.Value)))
                            && ((nombre == null) || (p.Nombre.Contains(nombre)))
                     select p).ToList();;

        return result;
    }
}

>>quiero usar un DataTable se puede?

podrias usar el CopyToDataTable() para convertir la clase

Cómo implementar CopyToDataTable donde el tipo genérico T no es un objeto DataRow

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *