У меня есть модель с тремя свойствами
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;}
Я хочу сгруппировать дочерние записи по parentid, суммировать сумму и назначить ее parent.fundedamount с помощью linq.
я пробую это так:
model.ForEach(f => f.childlist.Where(f1 => f1.parentid== f.Id).Sum(f2 => f2.Amount));
но как назначить его parent.fundedamount? Мне нужно использовать group by?
Я обошелся без linq вот так
foreach (var f in model) {
foreach (var fi in f.childlist)
{
if (fi.parentid== f.Id)
{
f.FundedAmount += (int)fi.Amount;
}
}
}
пожалуйста предложите
Во-первых, я группирую по childlist
по parentId
, чтобы получить набор отдельных 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 )
Почему бы не сделать FundedAmount свойством только для чтения и не вернуть ему сумму Amount в ChildList?
public int FundedAmount
{
get { return ChildList?.Sum(c => c.Amount) ?? 0; }
}