Lambda从同一个孩子得到总和和单值

tre*_*bon 0 c# lambda

我有一个问题,这个查询试图从同一个孩子得到一个和一个值

1级

class Project{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<SubProject> SubProjects { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

2级

class SubProject{
    public int Id { get; set; }
    public string Description { get; set; }
    public IEnumerable<Week> Weeks { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

3级

class Week{
    public int Week { get; set; }
    public int Hours { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是在一个范围内的所有周,在这样的新类列表中获得一个项目

class ProjectOverview{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<ProjectWeekOverview> Weeks { get; set; }
}
class ProjectWeekOverview{
    public int Week { get; set; }
    public int TotalHours { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过类似的东西,但是如果我今天所做的甚至是正确的话

List<Project> projects = { List.Of.Projects };
List<ProjectOverview> overview = projects
    .Select(p => new ProjectOverview
    {
        Id = p.Id,
        Name = p.Name,
        Weeks = p
            .SubProjects
            .Select(sp => new ProjectWeekOverview
            {
                Week = ????,
                TotalHours = sp
                    .Where(w => w.Week >= 30 && w.Week <= 35)
                    .Sum(w => w.Hours)
            })
    })
    .ToList();
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

编辑:一个子项目可以包含多个周项目,如同一周一样,用于存储不同操作的小时数

week { week = 10, hours = 3 }
week { week = 10, hours = 4 }
week { week = 11, hours = 3 }
Run Code Online (Sandbox Code Playgroud)

所以我想要的是将周属性设置为一周,并将总小时数与该周的所有小时数相加

Pet*_*tai 5

您需要GroupBy周,并将Week作为键,Sum作为项目.

试一试.输出是匿名类型,必须将其转换为您想要的任何类型的结果.它是重要的分组.

        List<Project> projects = null;

        var weeksAndHours = projects
            .Select(p => new 
            {
                Id = p.Id,
                Name = p.Name,
                Weeks = p
                    .SubProjects.SelectMany(sp => sp.Weeks)
                    .Where(w => w.Week >= 30 && w.Week <= 35)
                    .GroupBy(w => w.Week)
                    .Select(g => new { week = g.Key, hours = g.Sum( w=> w.Hours) })
            });
Run Code Online (Sandbox Code Playgroud)