¿Cómo uso LINQ para seleccionar de DataTable, con una lista de los nombres de columna requeridos?

Tengo algunos DataTables cargados en la memoria desde varias fuentes (SQL y MS Access), y cada conjunto de datos tiene varias columnas, con solo un subconjunto de columnas que son iguales entre cada conjunto de datos. Estoy trabajando en un código de sincronización de datos y quiero comparar estas tablas de datos, pero solo compararlas en función de las columnas que tienen en común. Si tuviera que hacerlo, probablemente podría hacer esto con muchos bucles, pero quiero sentirme más cómodo con LINQ y tener un código más conciso.

Hasta ahora, he logrado obtener una lista de nombres de columna de cada tabla de datos y usé Intersect para obtener la lista de nombres de columna comunes a ambos, así:

private string[] Common_ColumnNames {
    get {
        // get column names from source & destination data
        string[] src_columnNames = 
        (from dc in _srcDataTable.Columns.Cast<DataColumn>() 
        select dc.ColumnName).ToArray();

        string[] dest_columnNames = 
        (from dc in _destDataTable.Columns.Cast<DataColumn>() 
        select dc.ColumnName).ToArray();

        // find the column names common between the two data sets 
        // - these are the columns to be compared when synchronizing
        return src_columnNames.Intersect( dest_columnNames ).ToArray();                
    }
}

Ahora estoy atascado... Necesito seleccionar todas las filas de cada DataTable, pero solo con esas columnas comunes. En mi cabeza, veo que esto funciona de diferentes maneras:

1) seleccione todas las filas de una tabla de datos y pase la variable de cadena [] de la lista de columnas deseada para decirle a LINQ qué columnas quiero

2) seleccione todas las filas de una tabla de datos y use alguna función lambda (también bastante nueva para mí) para eliminar las columnas no deseadas de cada fila y generar una nueva tabla de datos con algunas columnas eliminadas.

Cualquier consejo/sugerencia sobre cómo lograr esto sería apreciado. ¡Gracias!

preguntado el 24 de agosto de 12 a las 19:08

Entiendo que solo desea comparar las columnas que tienen en común, pero ¿por qué intentar eliminar las columnas que no desea? ¿Por qué no simplemente ignorarlas? Lo que tendrá que hacer al final es crear una nueva tabla de datos con solo las columnas que desea, y luego tome las filas de las otras tablas y cree nuevas filas basadas en la nueva tabla de datos e importe los valores en esas nuevas filas. En realidad, no puede eliminar columnas de una fila. -

1 Respuestas

Bueno, no es LinQ, pero es bastante simple con un DataView

string[] commonCols = obj.Common_Columns;
DataView myTableView = new DataView(srcDataTable); 
DataTable srcReducedTable = myTableView.ToTable(false, commonCols); 

Referencias de MSDN

Respondido 24 ago 12, 20:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.