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

时间:2012-03-27 11:46:58

标签: c# lambda

我遇到此查询的问题,试图从同一个孩子中获取一个和一个值

第1类

class Project{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<SubProject> SubProjects { get; set; }
}

第2类

class SubProject{
    public int Id { get; set; }
    public string Description { get; set; }
    public IEnumerable<Week> Weeks { get; set; }
}

第3类

class Week{
    public int Week { get; set; }
    public int Hours { get; set; }
}

我正在尝试做的是在一个范围内的所有周,在一个新的类列表中获得一个项目

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; }
}

我已经尝试过类似的东西,但我也无法在本周获得它,如果我在这方面所做的甚至是正确的

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();

任何可以帮助解决这个问题的人?

修改:一个子项目可以包含多个星期项目,如同一周一样,用于存储不同行动的小时数

week { week = 10, hours = 3 }
week { week = 10, hours = 4 }
week { week = 11, hours = 3 }

所以我想要的是将周属性设置为一周,以及总周小时为该周所有小时数的总和

1 个答案:

答案 0 :(得分: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) })
            });