实体框架LINQ查询返回满足特定条件的集合列表和子集

时间:2017-12-20 05:42:47

标签: c# entity-framework linq

我有一个实体TimesheetHeader,其中包含User个对象,以及与时间表输入周相对应的开始日期和结束日期,以及ICollection TimesheetEntry

TimesheetEntry是另一个包含Project实体,日期和小时对象的实体(每个TimesheetEntry基本上记录了用户在一天中处理项目的小时数。)< / p>

我必须生成一份报告,以了解特定项目中每天工作的各种用户和工作小时数。

目前我的逻辑是首先获得如下列表:

context.TimesheetHeader.Where(u => u.status.statusName != "deleted" && DbFunctions.TruncateTime(u.StartDate) >= dateStart && u.TimesheetEntry.Any(te => te.projectId == report.project)).ToList(); 

但如果项目中至少有一个TimesheetHeader,则基本上会返回TimesheetEntry及其所有TimesheetEntry

然后我必须循环并过滤结果。

有没有更好的解决方案,我可以直接从查询本身获取结果,我得到TimesheetHeader,只有与项目对应的相关TimesheetEntry的子集

2 个答案:

答案 0 :(得分:1)

格特阿诺德回答here 您可以通过在include中添加where子句来尝试如下:

context.TimesheetHeader.Where(u => u.status.statusName != "deleted" && 
 DbFunctions.TruncateTime(u.StartDate) >= dateStart).Select(t => { t, TimesheetEntries = t.TimesheetEntry.Where(te => te.projectId == report.project)).AsEnumerable()
 .Select(x => x.t)
 .ToList();

或者看看EntityFramework-Plus。它可能有用。

答案 1 :(得分:1)

这有用吗?我还建议您对收藏品进行多元化,以便更清楚地了解您所处的关系的哪一端。

context.TimesheetHeaders .Where(u => u.status.statusName != "deleted") .Where(u => DbFunctions.TruncateTime(u.StartDate) >= dateStart) .Where(u => u.TimesheetEntries.Any(te => te.projectId == report.project)) .Select(u => new { TimeSheetHeader = u, TimeSheetHeaderEntries = u.TimesheetEntries.Where(te => te.projectId == report.project) })