c# - Entity Framework : Filtering navigation-property data

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

我正在努力使用 ASP MVC 模型/ Entity Framework 。我是个新手,所以这很大程度上是问题所在。我有 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) 位?

最佳答案

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

关于c# - Entity Framework : Filtering navigation-property data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30454528/

相关文章:

c# - 在 .NET 中从 YouTube 获取 FLV

linq - 如何在 lambda 表达式中调用方法?

c# - LINQ 加入不同的结果集

c# - UWP 应用程序不从本地主机上的 .NET 桌面应用程序接收 UDP 数据报

c# - 将对象转换为 System Guid

c# - 为什么\n 在 Log.Info 方法中不起作用?

javascript - 在两个不同大小的移动设备上返回相同的 x 和 y 坐标

c# - 单个 LINQ 表达式来计算数据集中的多个列

Javascript 未捕获语法错误 : missing ) after argument list

c# - ClrMd 在创建运行时时抛出异常