1

我试图找出一种更简单的方法,我可以采用以下代码并将其压缩为尽可能少的行。理想情况下,我想从中得到一个 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...
4

1 回答 1

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

笔记:

  1. 您的代码的第一行使用.Select(rid => rid.Id == reportId),但我认为这应该是Where而不是Select,否则您最终会得到一个集合,null因为Select结果将是 typebool并且每个as Report都会输出null
  2. 这仅适用Title于您所有的 sSubReportItems都是唯一的。可以想象一个Report可能有 10 个SubReports,而其中SubReports有两个或更多SubReportItems具有相同的Title. 如果是这种情况,那么您可能需要重新考虑一下,否则DuplicateKeyException当您尝试添加Title已经在字典中的 a 时,您会得到 a。

解释:

基本上,我们正在获取一组报告,并应用我们只想要 ID 为所需报告的报告的条件。就个人而言,我会将其放在单独的一行中,并使用SingleOrDefault而不是Where因为我只期望一个结果。

接下来,我们打电话.Cast<Report>只是因为你正在使用as Report,所以我猜你需要它。这在实践中可能是多余的和不必要的。

第一个.SelectMany电话会得到所有SubReportsReports。同样,此时我们可能只会有一个Report对象。

现在我们有一堆SubReports,但我们真的想得到所有的SubReportItems,所以我们用另一个SelectMany来得到那些。

现在我们已经SubReportItemSubReport所有 (1) Reports 中获得了所有 s,我们创建了字典。对于每一个SubReportItem我们从Title属性创建一个键,然后对于值,我们使用一个 finalSelectMany来获取NoteDetails与所有当前SubReportItemNotes 关联的所有对象。

于 2013-06-23T03:43:21.810 回答