我有一个实体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
的子集
答案 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)
})