1

我有两个DataTable,我想从第二个数据表中的第一个中选择行

例如:

表 1

 ColA1   ColA2
 1      sampletext1
 2      sampletext2
 4      sampletext4

表 2

ColA1   ColA2
 1      
 2  
 2    

我想要这样的输出:

表 2

ColA1   ColA2
 1      sampletext1
 2      sampletext2
 2      sampletext2

我尝试下面的代码,但它不起作用

foreach (DataRow dr in dtprofit.Rows)    
{  
    DataRow[] Selected = dtAccount.Select("AccDesc= '" + dr["Account"] + "' ");
    if(Selected.Length>0)
    {
        dr["Type"] = Selected[0]["AccType"];    
    }
}

提前致谢。

4

3 回答 3

2

您可以使用这个连接两个表的 LINQ 查询:

var commonRows = from row1 in Table1.AsEnumerable()
                 join row2 in Table2.AsEnumerable()
                 on row1.Field<int>("ColA1") equals row2.Field<int>("ColA1")
                 select new { row2, newValue = row1.Field<string>("ColA2") };
foreach (var commonRowInfo in commonRows)
{
    commonRowInfo.row2.SetField("ColA2", commonRowInfo.newValue);
}

结果:

1   sampletext1
2   sampletext2
2   sampletext2

这是另一种(可能效率较低)的方法:

var t1Rows = Table1.AsEnumerable();
foreach (DataRow row in Table2.Rows)
{
    DataRow row1 = t1Rows.FirstOrDefault(r => 
        row.Field<int>("ColA1") == r.Field<int>("ColA1"));
    if (row1 != null)
        row.SetField("ColA2", row1.Field<string>("ColA2"));
}

最后但并非最不重要的一点是,这是一种即使在 .NET 1.1 中也可以使用的没有 LINQ 的方法:

foreach (DataRow row in Table2.Rows)
{
    DataRow[] rows = Table1.Select("ColA1=" + row["ColA1"]);
    if (rows.Length >= 1)
        row["ColA2"] = rows[0]["ColA2"];
}
于 2013-10-17T13:51:58.827 回答
0

尝试这个:

var table1Dic = table1.AsEnumerable().ToDictionary(dr => dr.Field<int>("ColA1"), dr => dr.Field<string>("ColA2"));
foreach (var row in table2.AsEnumerable()) {
    var key = (int)row["ColA1"];
    if (table1Dic.ContainsKey(key))
        row.SetField<string>("ColA2", table1Dic[key]);
}
于 2013-10-17T13:52:05.050 回答
0

第一件事首先,获取两个数据表中共有的所有记录(不需要两个数据表的相同结构)。要选择常用行,请使用此代码。

   var sameRecords = from table1 in dtFirst.AsEnumerable() join table2 in  secondDt.AsEnumerable() on table1.Field<string>("abc") equals table2.Field<string>("def") where table1.Field<string>("abc") == table2.Field<string>("def") select table1;
        if (sameRecords .Count() > 0)
        {
           //Copy selected recors to the Data Table object

            DataTable dt =sameRecords .CopyToDataTable();
        }

现在,根据设置的标准,您拥有两个数据表中共有的所有记录。用于更新结果 DT 对象中的记录迭代行并像这样操作你想要的任何东西

foreach (DataRow row in dt.Rows)
{
 //Place your code
}

干杯............快乐编码

于 2013-12-20T10:30:14.477 回答