通过父代对子记录进行分组,并对linq C#求和

时间:2018-08-10 10:01:18

标签: c# linq linq-to-sql

我有一个具有三个属性的模型

id int {get; set:}
name varchar {get; set:}
int fundedamount {get;set;}
list<child> childlist {get; set:}

和这样的孩子

int id{get;set;}
int parentid{get;set;}
int amount{get;set;}

我想按父对象对子记录进行分组,然后将其总和使用linq分配给parent.fundedamount。

我正在这样尝试:

 model.ForEach(f => f.childlist.Where(f1 => f1.parentid== f.Id).Sum(f2 => f2.Amount));

但是如何将其分配给parent.fundedamount?我需要使用分组依据吗?

我没有这样的linq

               foreach (var f in model) {

                            foreach (var fi in f.childlist)
                            {
                                if (fi.parentid== f.Id)
                                {
                                    f.FundedAmount +=  (int)fi.Amount;
                                }
                            }  
                       }

http://prntscr.com/kgzgo4

请提出建议

2 个答案:

答案 0 :(得分:0)

首先,我将childlistparentId进行分组,以获得与总和id相关的不同Amount的集合。

接下来,对于此集合中的每个组,我更新与fundedamount相对应的GroupId,即模型的Id

model.childlist.GroupBy(x=> x.parentid).Select(group => new { 
               GroupId = group.Id,
               SumOfGroup = group.Sum(x => x.Amount)
           }).ToList()
             .ForEach(group => model.First(m => m.Id = group.GroupId).fundedamount = group.SumOfGroup )

答案 1 :(得分:0)

为什么不将FundedAmount设置为只读属性,并使其返回ChildList中Amount的总和?

public int FundedAmount
{
    get { return ChildList?.Sum(c => c.Amount) ?? 0; }
}