[C#] Combinación interna de tablas de datos en C #


Answers

Quería una función que uniera tablas sin necesidad de definir las columnas con un selector de tipo anónimo, pero tenía dificultades para encontrarla. Terminé teniendo que hacer el mío. Con suerte, esto ayudará a cualquier persona en el futuro que busque esto:

private DataTable JoinDataTables(DataTable t1, DataTable t2, params Func<DataRow, DataRow, bool>[] joinOn)
{
    DataTable result = new DataTable();
    foreach (DataColumn col in t1.Columns)
    {
        if (result.Columns[col.ColumnName] == null)
            result.Columns.Add(col.ColumnName, col.DataType);
    }
    foreach (DataColumn col in t2.Columns)
    {
        if (result.Columns[col.ColumnName] == null)
            result.Columns.Add(col.ColumnName, col.DataType);
    }
    foreach (DataRow row1 in t1.Rows)
    {
        var joinRows = t2.AsEnumerable().Where(row2 =>
            {
                foreach (var parameter in joinOn)
                {
                    if (!parameter(row1, row2)) return false;
                }
                return true;
            });
        foreach (DataRow fromRow in joinRows)
        {
            DataRow insertRow = result.NewRow();
            foreach (DataColumn col1 in t1.Columns)
            {
                insertRow[col1.ColumnName] = row1[col1.ColumnName];
            }
            foreach (DataColumn col2 in t2.Columns)
            {
                insertRow[col2.ColumnName] = fromRow[col2.ColumnName];
            }
            result.Rows.Add(insertRow);
        }
    }
    return result;
}

Un ejemplo de cómo puedes usar esto:

var test = JoinDataTables(transactionInfo, transactionItems,
               (row1, row2) =>
               row1.Field<int>("TransactionID") == row2.Field<int>("TransactionID"));

Una advertencia: Esto ciertamente no está optimizado, así que ten cuidado cuando llegues a recuentos de filas por encima de 20k. Si sabes que una mesa será más grande que la otra, intenta poner la más pequeña primero y la más grande por segundo.

Question

Deje que T1 y T2 sean DataTable s con los siguientes campos

T1(CustID, ColX, ColY)

T2(CustID, ColZ)

Necesito la mesa conjunta

TJ (CustID, ColX, ColY, ColZ)

¿Cómo se puede hacer esto en el código C # de una manera simple? Gracias.




esta función unirá 2 tablas con un campo de combinación conocido, pero esto no puede permitir 2 campos con el mismo nombre en ambas tablas, excepto el campo de unión, una modificación simple sería guardar un diccionario con un contador y simplemente agregar un número al mismo nombre filds.

public static DataTable JoinDataTable(DataTable dataTable1, DataTable dataTable2, string joinField)
{
    var dt = new DataTable();
    var joinTable = from t1 in dataTable1.AsEnumerable()
                            join t2 in dataTable2.AsEnumerable()
                                on t1[joinField] equals t2[joinField]
                            select new { t1, t2 };

    foreach (DataColumn col in dataTable1.Columns)
        dt.Columns.Add(col.ColumnName, typeof(string));

    dt.Columns.Remove(joinField);

    foreach (DataColumn col in dataTable2.Columns)
        dt.Columns.Add(col.ColumnName, typeof(string));

    foreach (var row in joinTable)
    {
        var newRow = dt.NewRow();
        newRow.ItemArray = row.t1.ItemArray.Union(row.t2.ItemArray).ToArray();
        dt.Rows.Add(newRow);
    }
    return dt;
}



Links