使用 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 实现此结果?
在我看来,您必须执行两个主要操作:
- 聚合
Table2
中的数据 - 更新
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();
}