using System.Collections.Generic;
using System.Threading.Tasks;
public static async Task Main()
var data = await GetPanelOfProject();
var dataStr = JsonConvert.SerializeObject(data);
Console.WriteLine(dataStr);
public static List<SurfacePanelDto> QueryData(){
List<SurfacePanelDto> panelData = new List<SurfacePanelDto>();
var parentId1 = Guid.NewGuid();
panelData.Add(new SurfacePanelDto { Id = parentId1, Name = "parent 1", OriginId = null, Quantity = 1 });
var parentId11 = Guid.NewGuid();
panelData.Add(new SurfacePanelDto { Id = parentId11, Name = "parent 11", OriginId = parentId1, Quantity = 1 });
var parentId111 = Guid.NewGuid();
panelData.Add(new SurfacePanelDto { Id = parentId111, Name = "parent 111", OriginId = parentId11, Quantity = 7 });
var parentId12 = Guid.NewGuid();
panelData.Add(new SurfacePanelDto { Id = parentId12, Name = "parent 12", OriginId = parentId1, Quantity = 1 });
var parentId2 = Guid.NewGuid();
panelData.Add(new SurfacePanelDto { Id = parentId2, Name = "parent 2", OriginId = null, Quantity = 1 });
var parentId21 = Guid.NewGuid();
panelData.Add(new SurfacePanelDto { Id = parentId21, Name = "parent 21", OriginId = parentId2, Quantity = 1 });
var parentId211 = Guid.NewGuid();
panelData.Add(new SurfacePanelDto { Id = parentId211, Name = "parent 211", OriginId = parentId21, Quantity = 5 });
var parentId22 = Guid.NewGuid();
panelData.Add(new SurfacePanelDto { Id = parentId22, Name = "parent 22", OriginId = parentId2, Quantity = 2 });
public static async Task<List<SurfacePanelDto>> GetPanelOfProject()
List<SurfacePanelDto> panels = new();
List<SurfacePanelDto> panelData = QueryData();
var rootPanels = panelData.Where(d => d.OriginId is null).ToList();
foreach (var panel in rootPanels)
panels.Add(GetPanelAndChildren(panelData, panel));
Console.WriteLine($"Error: {ex.Message}");
private static SurfacePanelDto GetPanelAndChildren(List<SurfacePanelDto> panelData, SurfacePanelDto panel)
panel.Children = panelData.Where(d => d.OriginId == panel.Id).ToList();
foreach (var child in panel.Children)
GetPanelAndChildren(panelData, child);
if (panel.Children.Any())
panel.Quantity = panel.Children.Sum(c => c.Quantity);
public class SurfacePanelDto
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int? Quantity { get; set; }
public Guid? OriginId { get; set; }
public List<SurfacePanelDto> Children { get; set; } = new();