Entity Framework:过滤导航-属性数据
Entity Framework: Filtering navigation-property data
我正在与 ASP MVC 模型作斗争/entity framework。我很新,所以这主要是问题所在。我有 3 个链接在一起的数据库 table:
- 项目
- 阶段
- 编译文件
每个阶段都链接到一个项目(在 Project
table 中)和 Compfiles
table.
中的数百个文件
我正在尝试构建一个报告,以显示给定项目编号 (PrjNo
) 的所有阶段和计算机文件。
我正在使用以下代码填充我的模型:
var stageFiles = db.Stages.Where(c => c.PrjNo == PrjNo)
.Include(c => c.Project)
.Include(c => c.Compfiles);
return View(stageFiles.ToList());
table Compfiles
有一列 IsLatest
,我只想显示 IsLatest = 1
.
的结果
如何根据 c.Compfiles
中的内容过滤 .Include(c => c.Compfiles)
位?
Entity Framework 不支持基于标准的 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
我正在与 ASP MVC 模型作斗争/entity framework。我很新,所以这主要是问题所在。我有 3 个链接在一起的数据库 table:
- 项目
- 阶段
- 编译文件
每个阶段都链接到一个项目(在 Project
table 中)和 Compfiles
table.
我正在尝试构建一个报告,以显示给定项目编号 (PrjNo
) 的所有阶段和计算机文件。
我正在使用以下代码填充我的模型:
var stageFiles = db.Stages.Where(c => c.PrjNo == PrjNo)
.Include(c => c.Project)
.Include(c => c.Compfiles);
return View(stageFiles.ToList());
table Compfiles
有一列 IsLatest
,我只想显示 IsLatest = 1
.
如何根据 c.Compfiles
中的内容过滤 .Include(c => c.Compfiles)
位?
Entity Framework 不支持基于标准的 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