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

C# 实体框架:过滤导航属性数据,c#,.net,linq,entity-framework,lazy-loading,C#,.net,Linq,Entity Framework,Lazy Loading,我正在努力使用ASPs MVC模型/实体框架。我是个新手,所以这主要是个问题。我有3个链接在一起的数据库表: 计划 舞台 复合文件 每个阶段都链接到一个项目(在project表中)和Compfiles表中的数百个文件 我正在尝试构建一个报告,该报告将显示给定项目编号(PrjNo)的所有阶段和计算机文件 我正在使用以下代码填充我的模型: var stageFiles = db.Stages.Where(c => c.PrjNo == PrjNo) .Include(c =

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

  • 计划
  • 舞台
  • 复合文件
每个阶段都链接到一个项目(在
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
的结果


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

实体框架不支持基于条件的
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; }
}

更多关于Try.Include(c=>c.Compfiles)的信息,其中(x=>x.IsLatest==1);非常感谢。我试试这个
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)
                       });