C# 使用LINQ更新基于组的数据表

C# 使用LINQ更新基于组的数据表,c#,asp.net,linq,datatable,C#,Asp.net,Linq,Datatable,我有两个具有相同标识列的datatable。我想用另一个表中的其他列值更新一个表中的一列值。例如: 以下是两个表格: 表1: ID Name PaidAmount ------ ------- --------- 1 AA 0 2 BB 0 3 CC 0 表2: ID

我有两个具有相同标识列的datatable。我想用另一个表中的其他列值更新一个表中的一列值。例如:

以下是两个表格:

表1:

   ID         Name          PaidAmount
 ------      -------        ---------
    1          AA             0
    2          BB             0
    3          CC             0
表2:

   ID        Amount
 ------    ---------
    1        5000
    2        6000
    3        7000
    1        2000
我想要的数据表应该是这样的:

可取的:

   ID         Name          PaidAmount
 ------      -------        ---------
    1          AA             7000
    2          BB             6000
    3          CC             7000
通常,在SQL SERVER中要更新,我们使用以下查询

  UPDATE
     T1
  SET
     T1.PaidAmount = T2.Amount
  FROM
     Table1 T1
     INNER JOIN
     (
       SELECT SUM(Amount) AS Amount, ID FROM Table2 GROUP BY ID
     )    T2 ON T1.ID = T2.ID

但是,如何使用LINQ实现这个结果呢?

我已经尝试过了,它对我来说非常有效

我通过考虑LINQ到实体来实施此解决方案

请尝试以下代码:

 var result = from t1 in db.Table1
                     let t2 = from q in db.Table2
                              group q by q.ID into g
                              select new
                              {
                                  ID = g.Min(i => i.ID),
                                  Amount = g.Sum(i => i.Amount)
                              }
                     select new
                     {
                         t1.ID,
                         t1.Name,
                         PaidAmount = t2.Where(s => s.ID == t1.ID).FirstOrDefault().Amount,

                     };

        foreach (var res in result.ToList())
        {
            Table1 t = (from t1 in db.Table1
                        where t1.ID == res.ID
                        select t1).Single();
            t.PaidAmount = res.PaidAmount;
            db.SaveChanges();
        }

在我看来,您必须执行两个主要操作:

  • 表2中聚集数据
  • 更新表1中的金额
  • 对于聚合:

    var aggregatedData = db.Table2
        .GroupBy(x => x.ID)
        .Select(g => new
        {
            Id = g.Key,
            Amount = g.Sum(x => x.Amount)
        });
    
    更新内容:

    var joined = aggregatedData.Join(db.Table1,
            aggregatedItem => aggregatedItem.Id,
            x => x.ID,
            (aggregated, item) => new
            {
                Item = item,
                Data = aggregated
            });
    foreach(var item in joined)
    {
        item.Item.PaidAmount = item.Data.Amount;
    }
    
    保存数据:

    db.SaveChanges();
    

    您是使用LINQtoSQL还是LINQtoEntities??