Défi :
Fusionner plusieurs DataTables avec des définitions de colonnes et des nombres de lignes différents tout en garantissant l'alignement et préserver l’intégrité des données peut être difficile.
Solution :
Pour surmonter ce problème et créer un seul DataTable complet, vous pouvez utiliser la méthode personnalisée suivante :
public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn) { // Validate arguments if (!tables.Any()) throw new ArgumentException("Tables must not be empty", "tables"); if (primaryKeyColumn != null) foreach (DataTable t in tables) if (!t.Columns.Contains(primaryKeyColumn)) throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn"); DataTable table = new DataTable("TblUnion"); // Disable data validation during bulk loading table.BeginLoadData(); // Merge all tables into the result table foreach (DataTable t in tables) table.Merge(t, false, MissingSchemaAction.Add); // End data validation table.EndLoadData(); // Handle duplicate primary keys (if specified) if (primaryKeyColumn != null) { // Group rows by primary key column var pkGroups = table.AsEnumerable().GroupBy(r => r[primaryKeyColumn]); // Identify groups with duplicate keys var dupGroups = pkGroups.Where(g => g.Count() > 1); // Combine data from duplicate rows into the first row of each group foreach (var grpDup in dupGroups) { // Use the first row and modify it to include data from other rows DataRow firstRow = grpDup.First(); foreach (DataColumn c in table.Columns) { if (firstRow.IsNull(c)) { // Find the first non-null row for the current column and copy its value DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c)); if (firstNotNullRow != null) firstRow[c] = firstNotNullRow[c]; } } // Remove duplicate rows var rowsToRemove = grpDup.Skip(1); foreach (DataRow rowToRemove in rowsToRemove) table.Rows.Remove(rowToRemove); } } // Return the merged table return table; }
Utilisation :
var tables = new[] { tblA, tblB, tblC }; DataTable TblUnion = tables.MergeAll("c1");
Cette méthode fournit une solution robuste pour fusionner des DataTables, gérer l'alignement des données et préserver les clés données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!