我的课程目标,其中包含对象集合 ProgressItems 。进度项具有属性日期。
我想只获得具有日期在指定范围之间的进度项目的目标。 目标应包含 ProgressItems ,但仅限于传递日期条件。
我该如何修改LINQ?
var goalIds = _dbContext.GoalProgressItems
.Include(p => p.Goal)
.Where(p => p.Date >= range.From && p.Date <= range.To)
.Select(p => p.Id);
var goals = _dbContext.Goals
.Include(p => p.ProgressItems)
.Where(p => goalIds.Contains(p.Id))
.ToList();
答案 0 :(得分:1)
您只需要在两个流上执行.Join()
。由于已经过滤了goalIds
,因此它不会引用任何指定范围内没有项目的Goals
,因此,.Join()
会过滤goals
中没有goalIds
中匹配条目(-ies)的项目。
var goalIds = _dbContext.GoalProgressItems
.Include(p => p.Goal)
.Where(p => p.Date >= range.From && p.Date <= range.To);
var goals = _dbContext.Goals
.Include(p => p.ProgressItems)
.Join(goalIds, g => g, gpi => gpi.GoalId, (g, gpi) => g);
所以现在goals
应该只包含那些具有所需范围内的进度项的内容。
答案 1 :(得分:0)
这个查询怎么样?
dbContext.Goals.Include(p => p.ProgressItems)
.Where(p => p.ProgressItems.Any(pr => pr.Date >= range.From && pr.Date <= range.To))
.ToList();
请注意,使用LB2提到的连接可能会生成更有效的SQL查询(前提是您可以更改模型以执行连接)。