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

本文关键字:属性 数据 导航 过滤 框架 实体 | 更新日期: 2023-09-27 17:50:43

我正在与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 .

如何根据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; }
}

当查询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的更多信息