LINQ:获取带有过滤子集合项的过滤对象?

时间:2017-05-18 16:28:42

标签: c# entity-framework linq orm

我的课程目标,其中包含对象集合 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();

2 个答案:

答案 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查询(前提是您可以更改模型以执行连接)。