0

我有一个报告软件,我一直在使用报告列表。在我们的一个界面上,可以显示多个时间段。每份报告都有 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
---case
--project
---case
---case
---case
--project
---case
---case
-person
--project
---case
--project
-- -case
---case
---case
--project
---case
---case

报告
-person
--project
---case
--project
---case
---case
---case
--project
---case
---case
-person
--project
---case
--project
-- -case
---case
---case
--project
---case
---case

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

报告
-person
--project
---case
---case
---case
---case
--project
---case
---case
---case
--project
---case
---case
-- -case
---case
---case
-person
--project
---case
---case
---case
--project
---case
---case
---case
--project
---case
- --案例---
案例
---案例

4

2 回答 2

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 下。从那里您可以随心所欲地操纵信息。

于 2012-10-03T01:20:43.000 回答
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 的所有实体的子集合。

于 2012-10-03T01:37:42.767 回答