列表分组 - Lambda或Linq

时间:2012-10-03 00:52:11

标签: c# linq lambda

我有一个报告软件,我一直在处理报告列表。在我们的一个界面上,可以显示多个时间段。每个报告的时间范围为1天,每个时间段我们都会抓取每天的报告并将其添加到报告列表中。这导致了大量乱码并编制了数字,我试图重构它。

我遇到lambda表达式或linq查询的问题。我想将所有报告分组到一份报告中。在这份单一报告中,我希望所有人都能与他们的项目和案例合并。

class TimeReport : Report // Report handles basic stuff like time generated, start/end //date ect.
{
     public  List<ReportPersonRow> results;
     // more methods below for handling other report details
}

class ReportPersonRow
{
    public long PersonId {get;set;}
    public string PersonName {get;set;}
    public List<ReportProjectRow> Projects {get;set;}

    // more methods below for handling other details
}

class ReportProjectRow
{
    public long ProjectId{get;set;}
    public string ProjectName{get;set;}
    public List<ReportProjectCaseRow> Projects {get;set;}

    // more methods below for handling other details
}

class ReportProjectCaseRow
{
    public long CaseId{get;set;}
    public string CaseName{get;set;}
    public string HoursLogged{get;set;}

    // more methods below for handling other details
}

我最初开始和各种其他人甚至试图去任何地方,我迷失了方向,或者我甚至应该这样做。

 var flatList = Model.Reports.SelectMany(x => x.Results).GroupBy(x => x.PersonId);

数据目前的样子以及我想要实现的目标如下。

报告
-person
--project
---情况下
--project
---情况下
---情况下
---情况下
--project
---情况下
---情况下
-person
--project
---情况下
--project
---情况下
---情况下
---情况下
--project
---情况下
---情况

报告
-person
--project
---情况下
--project
---情况下
---情况下
---情况下
--project
---情况下
---情况下
-person
--project
---情况下
--project
---情况下
---情况下
---情况下
--project
---情况下
---情况

最终结果将是(之前的所有报告合并为1)

报告
-person
--project
---情况下
---情况下
---情况下
---情况下
--project
---情况下
---情况下
---情况下
--project
---情况下
---情况下
---情况下
---情况下
---情况下
-person
--project
---情况下
---情况下
---情况下
--project
---情况下
---情况下
---情况下
--project
---情况下
---情况下
---情况下
---情况

2 个答案:

答案 0 :(得分:0)

var flatlist = from r in Model.Reports
               from p in r.Results
               from c in p.Projects
               group c by p.PersonId
               into grp;
               select grp;

可能?我真的不确定你想要什么。这将创建一个按人员ID分组的ReportProjectRow列表。

“我想将所有报告分组到一份报告中。在这份报告中,我希望所有人都能与他们的项目和案例合并。”

这将获取所有报告,找到这些报告中的所有人,查找所有这些人的所有项目,然后将人员ID下的项目分组。从那里你可以随心所欲地操纵信息。

答案 1 :(得分:0)

您需要先进行GroupBy

var flatList = Model.results.GroupBy(r => r.PersonId)
                            .Select(group => new { Group = group.Key, Results = group.SelectMany(x => x.Projects) });

您可能需要调整查询,因为它可能无法正确返回您要查找的内容,但您应该明白这一点。 Select的group参数是唯一PersonId的所有实体的子集合。