2013-12-18 17 views
0

我有兩個具有相同標識列的數據表。我想用另一個表中的其他列值更新一個表中的一個列值。例如:基於組更新數據表使用LINQ

這些是兩個表:

表1:

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

表2:

ID  Amount 
------ --------- 
    1  5000 
    2  6000 
    3  7000 
    1  2000 

我所需的數據表應該是這樣的:

DesiredTable:

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這樣的結果?

+0

你使用LINQ to SQL或LINQ到實體? ? –

+0

LINQ to Entities。 – thevan

回答

1

在我看來,你必須執行兩項主要業務:

  1. 彙總數據Table2
  2. 更新amo UNT在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(); 
1

我試過這個,它對我來說是完美的。

我已經考慮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(); 
     }