将一列从一个数据集中添加到另一个

Posted

技术标签:

【中文标题】将一列从一个数据集中添加到另一个【英文标题】:Adding a column from One DataSet to other 【发布时间】:2012-04-25 18:04:04 【问题描述】:

有一个 Dataset Ds1 和 dataset Ds2 ,DS1 有 Product_ID,产品信息,ds2 有 Product_ID,product_type。

对于匹配的 product_id,我想将 Product_tye 列从 ds2 添加到 ds1 。

注意:product_id 不是 ds 1 中的主键,结果集中有很多相同 product_id 的产品。在 ds 2 中,product_id 是唯一的。此外,这些数据表来自不同服务器上的两个不同数据库,并且具有不同的凭据,因此不能使用 sql 连接。

我尝试使用 linq 来实现这一点,但没有得到所需的输出,如果我遗漏了什么,请纠正我。

DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
//After both the datatble has values, using linq to add datatble columsn, 

DataTable result = (from t1 in dt1.AsEnumerable()
                            join t2 in dt2.AsEnumerable() on t1.Field<string>("productID") equals t2.Field<string>("productID")
                            select t1).CopyToDataTable();

【问题讨论】:

我不知道这会这么简单。您必须在 table1 中创建一个新列,然后循环遍历两个表的行并检查 ids 并根据产品 id 将 prodict_type 添加到 table1 的确切行。 【参考方案1】:

选择两个表

DataTable result = (from t1 in dt1.AsEnumerable()
                        join t2 in dt2.AsEnumerable() on t1.Field<string>("productID")  
                                     equals t2.Field<string>("productID")
                        select new t1,t2
                    ).CopyToDataTable();

或选择选定的列

DataTable result = (from t1 in dt1.AsEnumerable()
                        join t2 in dt2.AsEnumerable() on t1.Field<string>("productID") 
                                      equals t2.Field<string>("productID")
                        select new 
                         productId = t1.productID, 
                         col2 = t1.col2,...,
                         productType = t2.pruductType
                    ).CopyToDataTable();

注意:我认为 productID 类型应该是 int 类型,所以在这种情况下用 int 替换 string

【讨论】:

第二次查询:选中列列表后需要关闭大括号。 select new ....【参考方案2】:

我刚刚为您创建了一个简单的示例,您需要做的是使用您自己的代码更改我的代码中的列名:

        DataTable table1 = new DataTable();
        DataTable table2 = new DataTable();
        table1.Columns.Add("id", typeof(int));
        table1.Columns.Add("name", typeof(string));
        table2.Columns.Add("id", typeof(int));
        table2.Columns.Add("age", typeof(int));

        table1.Rows.Add(1, "mitja");
        table1.Rows.Add(2, "sandra");
        table1.Rows.Add(3, "nataška");

        table2.Rows.Add(1, 31);
        table2.Rows.Add(3, 24);
        table2.Rows.Add(4, 46);

        DataTable targetTable = table1.Clone();
        //create new column
        targetTable.Columns.Add("age");

        var results = from t1 in table1.AsEnumerable()
                      join t2 in table2.AsEnumerable() on t1.Field<int>("id") equals t2.Field<int>("id")
                      select new
                      
                          ID = (int)t1["id"],
                          NAME = (string)t1["name"],
                          AGE = (int)t2["age"]
                      ;

        foreach (var item in results)
            targetTable.Rows.Add(item.ID, item.NAME, item.AGE);

在任何情况下定义变量类型(int,string,...)时都要小心!!! 希望对您有所帮助。

【讨论】:

以上是关于将一列从一个数据集中添加到另一个的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 基于连接将列从一个数据帧添加到另一个数据帧

如何将一列插入到两个现有列之间的数据集中?

SQL - 将一列复制到另一列

在scala中将列从一个数据帧添加到另一个数据帧[重复]

SAS 中怎么把一个数据集中的某个变量 添加到另一个数据集中?谢谢高手指教。

mysql怎样将一张表里一列的数据更新到另一个表的一列上