使用 LINQ 基于组更新数据表

本文关键字:更新 数据表 于组 LINQ 使用 | 更新日期: 2024-11-01 01:43:50

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

这是两个表:

表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 基于组更新数据表

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

  1. 聚合Table2中的数据
  2. 更新Table1中的金额

对于聚合:

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();

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

我已经通过考虑 LINQ to 实体来实现此解决方案

请尝试以下代码:

 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();
        }