0

在将此问题标记为重复之前,任何人都可以帮助我将多个数据表合并到一个数据表中。

这是我的代码:

     static void Main(string[] args)
            {
    
                var tblA = new DataTable();
                tblA.Columns.Add("ChannelNodeCategoryName");
                tblA.Columns.Add("CategoryName");
                tblA.Columns.Add("Language");
    
                var tblB = new DataTable();
                tblB.Columns.Add("ChannelNodeDescription");
                tblB.Columns.Add("CategoryName");
                tblB.Columns.Add("Language");
    
                DataRow row = tblA.NewRow();
                row["ChannelNodeCategoryName"] = "Comfort";
                row["CategoryName"] = "Solution";
                row["Language"] = "en";
                tblA.Rows.Add(row);
    
                DataRow row1 = tblA.NewRow();
                row1["ChannelNodeCategoryName"] = "Confort";
                row1["CategoryName"] = "Solution";
                row1["Language"] = "fr";
                tblA.Rows.Add(row1);
    
                DataRow row2 = tblA.NewRow();
                row2["ChannelNodeCategoryName"] = "Women";
                row2["CategoryName"] = "Test";
                row2["Language"] = "en";
                tblA.Rows.Add(row2);
    
                DataRow row3 = tblA.NewRow();
                row3["ChannelNodeCategoryName"] = "Femmes";
                row3["CategoryName"] = "Test";
                row3["Language"] = "fr";
                tblA.Rows.Add(row3);
    
    
                //---------------------------------------------------------------------------------
                DataRow sec = tblB.NewRow();
                sec["ChannelNodeDescription"] = "Men's T-shirts - Buy T-shirts for men online ";
                sec["CategoryName"] = "Solution";
                sec["Language"] = "en";
                tblB.Rows.Add(sec);
    
                DataRow sec1 = tblB.NewRow();
                sec1["ChannelNodeDescription"] = "T-shirts pour hommes - Achetez des";
                sec1["CategoryName"] = "Solution";
                sec1["Language"] = "fr";
                tblB.Rows.Add(sec1);
    
                DataRow sec2 = tblB.NewRow();
                sec2["ChannelNodeDescription"] = "Jeans";
                sec2["CategoryName"] = "Test";
                sec2["Language"] = "en";
                tblB.Rows.Add(sec2);
    
                DataRow sec3 = tblB.NewRow();
                sec3["ChannelNodeDescription"] = "jeans";
                sec3["CategoryName"] = "Test";
                sec3["Language"] = "fr";
                tblB.Rows.Add(sec3);

          //3rd table
            var tblC = new DataTable();
            tblC.Columns.Add("ChannelNodeMetaDetails");
            tblC.Columns.Add("CategoryName");
            tblC.Columns.Add("Language");

            DataRow tlbCRow = tblC.NewRow();
            tlbCRow["ChannelNodeMetaDetails"] = "t shirt for mens india";
            tlbCRow["CategoryName"] = "Solution";
            tlbCRow["Language"] = "en";
            tblC.Rows.Add(tlbCRow);

            DataRow tlbCRow1 = tblC.NewRow();
            tlbCRow1["ChannelNodeMetaDetails"] = "t-shirt pour hommes en Inde";
            tlbCRow1["CategoryName"] = "Solution";
            tlbCRow1["Language"] = "fr";
            tblC.Rows.Add(tlbCRow1);


            //4th table
            var tblD = new DataTable();
            tblD.Columns.Add("ChannelNodeMetaTitle");
            tblD.Columns.Add("CategoryName");
            tblD.Columns.Add("Language");

            DataRow tblDRow = tblD.NewRow();
            tblDRow["ChannelNodeMetaTitle"] = "MT- PRFT Test";
            tblDRow["CategoryName"] = "Solution";
            tblDRow["Language"] = "en";
            tblD.Rows.Add(tblDRow);

            DataRow tblDRow1 = tblD.NewRow();
            tblDRow1["ChannelNodeMetaTitle"] = "Meta titre";
            tblDRow1["CategoryName"] = "Solution";
            tblDRow1["Language"] = "fr";
            tblD.Rows.Add(tblDRow1);

            List<DataTable> dataTables = new List<DataTable>
            {
                tblA, tblB, tblC,tblD
            };
    
            DataTable dt = dataTables.MergeAll("CategoryName");
    
            Console.ReadLine();
            }

注意:我在这里找到了 MergeAll 函数Combining n DataTables into a Single DataTable

MergeAll 函数不返回属于“fr”语言的行。

我有可能获得 n 个表,这些表将始终包含“CategoryName”和“Language”列以及它们自己的列。(比如这里的“ChannelNodeCategoryName”或“ChannelNodeDescription”是它们自己的列,但有“Language” " 和 "CategoryName" 常见)。

这是我想要实现的输出在此处输入图像描述


我被困得很厉害。任何人都可以帮助我实现这一目标吗?谢谢
4

1 回答 1

0

这不会解决您对任意数量的表格的要求,但也许您可以从这个解决方案中为正好两个表格汲取灵感。您可能会考虑将数据规范化为列表,直接使用 DataTables 很麻烦。

DataTable tblFinal = new DataTable();
tblFinal.Columns.Add("ChannelNodeCategoryName");
tblFinal.Columns.Add("ChannelNodeDescription");
tblFinal.Columns.Add("CategoryName");
tblFinal.Columns.Add("Language");

var qry = from a in tblA.AsEnumerable()
          join b in tblB.AsEnumerable()
              on new { cat = a.Field<string>("CategoryName"), lang = a.Field<string>("Language")} 
              equals new { cat = b.Field<string>("CategoryName"), lang = b.Field<string>("Language")}
              into j
          select new { CatName = a.Field<string>(0), j};

foreach (var item in qry)
{
    foreach (var grp in item.j)
    {
        tblFinal.Rows.Add(item.CatName, grp.Field<string>(0), grp.Field<string>(1), grp.Field<string>(2));
    }
}

在此处输入图像描述

于 2021-04-03T17:54:01.637 回答