比较在第二个数据表中更新的两个数据表和公共值?

时间:2013-10-17 13:43:02

标签: c#

我有两个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"];    
    }
}

提前致谢。

3 个答案:

答案 0 :(得分: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"));
}

最后但同样重要的是,这是一种没有LINQ的方法,即使在.NET 1.1中也能正常工作:

foreach (DataRow row in Table2.Rows)
{
    DataRow[] rows = Table1.Select("ColA1=" + row["ColA1"]);
    if (rows.Length >= 1)
        row["ColA2"] = rows[0]["ColA2"];
}

答案 1 :(得分: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]);
}

答案 2 :(得分: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
}

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