2013-12-18 4 views
0

У меня есть два типа данных с одинаковым столбцом идентификации. Я хочу обновить одно значение столбца в одной таблице с другим значением столбца в другой таблице. Например:Обновление DataTable на основе группы С помощью LINQ

Эти две таблицы:

Table1:

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

Table2:

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

Мой желаемый DataTable должен быть таким:

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 ЕНТ в 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(); 
     } 
Смежные вопросы