Лямбда, чтобы получить сумму и единственное значение от того же самого ребенка - PullRequest
0 голосов
/ 27 марта 2012

У меня проблема с этим запросом, когда я пытаюсь получить сумму и одно значение от одного и того же потомка

Класс 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 Ответ

5 голосов
/ 27 марта 2012

Вам нужно GroupBy неделя, и неделя в качестве ключа и Сумма в качестве элемента.

Дайте это попробовать. Вывод является анонимным типом, должен быть преобразован в любой тип, который вы хотите получить. Это группировка, которая имеет значение.

        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) })
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...