"Where" Entity Framework 中的子句未检索子实体

"Where" clause in Entity Framework not retrieving child entities

这是交易。

我的模型中有两个相关的表。我们将命名它们:reportssubReports

很重要的一点是我不知道,此时我需要的报告的reportId,所以我需要使用一些参数来找到它。 好的,所以,如果我需要通过 EntityFramework 查询 reports 的一个元素,我将执行以下操作:

reports myReport = context.reports.Where(r=> r.startYear.Equals(2014) && r.endYear.Equals(2015) && r.reportCategoryId.Equals(1)).SingleOrDefault();

此行检索与信息匹配的唯一报告。

但这就是问题所在。如果我想访问myReport应该有的subReports的集合,结果发现这个集合是空的。这是我的问题,我不知道为什么。我的表格正确相关。

奇怪的是,如果我这样更改我的查询:

reports myReport = context.reports.Where(r=> r.reportId.Equals(1)).SingleOrDefault();

已加载相关实体,并且集合具有它应有的子报表。看到不同?我必须通过 reportId,但这不是我需要的,因为,正如我已经告诉过你的,我不知道 reportId

你知道发生了什么事吗?

提前谢谢你:)

您尝试过这些技巧吗?

本文来自this MSDN page about eager loading

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 

    // Load one blogs and its related posts 
    var blog1 = context.Blogs 
                        .Where(b => b.Name == "ADO.NET Blog") 
                        .Include(b => b.Posts) 
                        .FirstOrDefault(); 

    // Load all blogs and related posts  
    // using a string to specify the relationship 
    var blogs2 = context.Blogs 
                          .Include("Posts") 
                          .ToList(); 

    // Load one blog and its related posts  
    // using a string to specify the relationship 
    var blog2 = context.Blogs 
                        .Where(b => b.Name == "ADO.NET Blog") 
                        .Include("Posts") 
                        .FirstOrDefault(); 
}


懒加载和急加载的一些说明

一般来说,我倾向于在没有延迟加载的情况下工作。我想知道何时加载我的实体,何时不加载(急切加载)。

延迟加载可以关闭

  • 完全通过在DbContext:

    上设置各自的属性

    this.Configuration.LazyLoadingEnabled = false;

  • 当导航 属性 未标记为虚拟时,
  • 用于特定实体。有关详细信息,请参阅链接的 MSDN 文章