我有两个Table1和Table2,其列的值如下:
这是两个表:
我想更新表1中的“ PaidAmount”。基于两个表中的“ InvoiceNo”列进行联接。

表格1:

 InvoiceNo  Vendor   InvoiceValue  InvoiceDate      PaidAmount
 ---------  ------   ------------- -----------      ----------
    1        AA        15000       01 Dec 2013         0
    2        BB        20000       10 Dec 2013         0
    3        CC        10000       18 Dec 2013         0


表2:

 VoucherNo   Date       InvoiceNo  Amount
 -------   ----------- ----------  ------
   001     01 Nov 2013    1         5000
   002     10 Nov 2013    2         6000
   003     20 Nov 2013    3         7000
   001     02 Nov 2013    1         2000


我想要的数据表应该是这样的:

所需表:

 InvoiceNo  Vendor   InvoiceValue  InvoiceDate      PaidAmount
 ---------  ------   ------------- -----------      ----------
     1        AA        15000       01 Dec 2013        7000
     2        BB        20000       10 Dec 2013        6000
     3        CC        10000       18 Dec 2013        7000


如何取得这个结果?
我已经尝试了以下之一。

Table1.AsEnumerable().Join(Table2.AsEnumerable(),
                      dt1_Row => dt1_Row.ItemArray[0],
                      dt2_Row => dt2_Row.ItemArray[2],
                      dt1_Row, dt2_Row) => new { dt1_Row, dt2_Row }
                      ).ToList()
                   .ForEach(o => o.dt1_Row.SetField(4, o.dt2_Row.ItemArray[3]));


但是它给出的结果是

InvoiceNo  Vendor   InvoiceValue  InvoiceDate      PaidAmount
---------  ------   ------------- -----------      ----------
    1        AA        15000       01 Dec 2013        2000
    2        BB        20000       10 Dec 2013        6000
    3        CC        10000       18 Dec 2013        7000


如何获得我想要的桌子?

最佳答案

您的加入为您提供了多个row1,row2对的列表。
因此,您将每两遍循环一次,第一次是invoiceNo1,row1.PaidAmount = 5000,然后继续循环,第二次,是row1.PaidAmount = 2000,所以结果是这样。

您想对row2的Amount值求和,因此在加入后,必须按InvoiceValue将数据分组,然后执行求和:

foreach(var grp in Table1.AsEnumerable()
      .Join(Table2.AsEnumerable(),
            dt1_Row => dt1_Row.ItemArray[0],
            dt2_Row => dt2_Row.ItemArray[2],
            dt1_Row, dt2_Row) => new { dt1_Row, dt2_Row }
       )
      .GroupBy(o => o.dt1_Row.ItemArray[0]))
{
    var row1 = grp.First().dt1_Row;
    var sum = grp.Sum(t => Convert.ToDecimal(t.dt2_Row.ItemArray[3]));
    row1.SetField(4, sum)
}


为了提高可读性,请尝试避免使用List的ForEach,它并不能真正改善您的代码。

08-06 18:51