"Where" Entity Framework 中的子句未检索子实体
"Where" clause in Entity Framework not retrieving child entities
这是交易。
我的模型中有两个相关的表。我们将命名它们:reports
和 subReports
。
很重要的一点是我不知道,此时我需要的报告的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 文章
这是交易。
我的模型中有两个相关的表。我们将命名它们:reports
和 subReports
。
很重要的一点是我不知道,此时我需要的报告的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 文章