我试图找出一种更简单的方法,我可以采用以下代码并将其压缩为尽可能少的行。理想情况下,我想获得一个IDictionary>出于这一点。
var report = db.Reports.Select(rid => rid.ID == reportId) as Report;
Dictionary<string, List<string>> notes = new Dictionary<string, List<string>>();
foreach (var subreport in report.SubReports)
{
foreach (var subreportitem in subreport.SubReportItems)
{
notes[subreportitem.Title] = new List<string>();
foreach (var note in subreportitem.SubReportItemNotes)
{
notes[subreportitem.Title].Add(note.NoteDetails);
}
}
}
理想情况下,我曾经想做过这样的事情:
from report in db.Reports
where report.ID == reportId
from subreports in report.SubReports
from subreportitems in subreports.SubReportItems
from notes in subreportitems.SubReportItemNotes
//Unsure how to select into the desired dictionary...
答案 0 :(得分:3)
这应该是等价的:
db.Reports
.Where(rpt => rpt.ID == reportId)
.Cast<Report>()
.SelectMany(rpt => rpt.SubReports)
.SelectMany(subRpt => subRpt.SubReportItems)
.ToDictionary(
sri => sri.Title,
sri => sri.SubReportItemNotes.SelectMany(note => note.NoteDetails);
.Select(rid => rid.Id == reportId)
,但我认为这应该是Where
而不是Select
,否则您最终会得到null
的集合因为Select
结果的类型为bool
,而as Report
会为每个结果输出null
。Title
的所有SubReportItems
都是唯一的时,此方法才有效。可以想象,一个Report
可以有10个SubReports
,而SubReports
个SubReportItems
中有两个或更多个Title
具有相同的DuplicateKeyException
。如果是这种情况,那么您可能需要重新考虑一下,否则当您尝试添加字典中已有的Title
时,您将获得SingleOrDefault
。基本上,我们正在处理这组报告,并应用我们只想要报告所需ID的条件。就个人而言,我会将其放在一个单独的行中,并使用Where
代替.Cast<Report>
,因为我只期望一个结果。
接下来,我们仅仅因为您使用as Report
而致电.SelectMany
,因此我猜您需要它。在实践中,这可能是多余的,也是不必要的。
第一次SubReports
来电将获得所有Reports
的所有Report
。同样,我们此时可能只会有一个SubReports
对象。
现在我们有一堆SubReportItems
,但我们真的希望获得所有SelectMany
,因此我们使用另一个SubReportItem
来获取这些内容。
现在我们已经拥有来自所有(1)SubReport
的所有Report
的所有SubReportItem
s,我们创建了字典。对于每个Title
,我们从SelectMany
属性创建一个键,然后对于值,我们使用一个最终NoteDetails
来获取与当前所有SubReportItemNote
相关联的所有{{1}}个对象{1}}秒。