【问题标题】:"Where" clause in Entity Framework not retrieving child entities实体框架中的“Where”子句不检索子实体
【发布时间】:2015-11-12 20:53:54
【问题描述】:

这是交易。

我的模型中有两个相关的表。我们将为他们命名: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

你知道发生了什么吗?

提前谢谢你:)

【问题讨论】:

  • 好吧,你不Include子报告,所以你需要允许延迟加载之后才能得到它们。在您的第一个查询中禁用延迟加载。如果没有更多细节,我无法判断它是什么。但是由于延迟加载可能的,我能想到的唯一区别是,在第一种情况下,延迟加载在上下文中被禁用。
  • 我尝试了包含的东西。原来是这样。谢谢!

标签: c# entity-framework entity-framework-4 where-clause navigation-properties


【解决方案1】:

你尝试过这些技巧吗?

这是来自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 文章

【讨论】:

  • Include(r=> r.subReports) 没有成功,但Include("subReports") 确实取得了成功。谢谢。
  • 好的,我认为这取决于您使用的 EF 版本,它可能适用于 EF5 或 EF6
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 2011-10-21
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
相关资源
最近更新 更多