实体框架:过滤导航属性数据

时间:2015-05-26 09:22:18

标签: c# .net linq entity-framework lazy-loading

我正在努力使用ASP MVC模型/实体框架。我很新,所以这主要是问题所在。我有3个链接在一起的数据库表:

  • 项目
  • 阶段
  • Compfiles

每个阶段都链接到一个项目(在Project表中)和Compfiles表中的数百个文件。

我正在尝试制作一份报告,显示所有阶段&给定项目编号(PrjNo)的计算机文件。

我正在使用此代码填充我的模型:

    var stageFiles = db.Stages.Where(c => c.PrjNo == PrjNo)
    .Include(c => c.Project)
    .Include(c => c.Compfiles);

    return View(stageFiles.ToList());

Compfiles有一列IsLatest,我只想在IsLatest = 1显示结果。

如何根据.Include(c => c.Compfiles)中的内容过滤c.Compfiles位?

1 个答案:

答案 0 :(得分:2)

实体框架不支持基于标准的Include(),一旦您包含一些导航属性,将从数据库中提取整个(相关)数据。

您还需要意识到Include()仅用于指示EF 预取相关数据,它与查询条件无关。

但是,如果您要创建一个自定义类型来包装所有必需(报告)字段,然后使用投影来仅获取相关数据,则可以轻松缓解此问题。例如:

public class StageReportData
{
    // Stage primary-key
    public int Id { get; set; }

    // More Stage data that is needed for the report
    // ...

    public Project Project { get; set; }

    public IEnumerable<Compfile> Compfiles { get; set; }
}

然后查询EF:

var stageFiles = db.Stages
                   .Where(c => c.PrjNo == PrjNo)
                   .Select(x => new StageReportData
                       {
                       Id = x.Id,
                       Project = x.Project,
                       Compfiles = x.Compfiles.Where(c => c.IsLatest == 1)
                       });

更多关于MSDN