实体框架上下文加载错误
本文关键字:错误 加载 上下文 框架 实体 | 更新日期: 2023-09-27 17:57:28
在下面的代码片段中,我将在select的返回处放置一个brakpoint。
在这种情况下,断点被正确命中
context.campaigns
.Include("adgroups")
.Include("campaigntimeranges")
.ToList()
.Where(p=> p.LastUpdate < fromDate &&
p.campaigntimeranges.OrderByDescending(q => q.EntryDate).FirstOrDefault().DateStart >= fromDate &&
p.campaigntimeranges.OrderByDescending(q => q.EntryDate).FirstOrDefault().DateStart <= currentDate
)
.ToList().Select(x => {
return x; //Breakpoint here
}).ToList();
在这种情况下,(.ToList()被删除)断点永远不会命中
context.campaigns
.Include("adgroups")
.Include("campaigntimeranges")
.Where(p=> p.LastUpdate < fromDate &&
p.campaigntimeranges.OrderByDescending(q => q.EntryDate).FirstOrDefault().DateStart >= fromDate &&
p.campaigntimeranges.OrderByDescending(q => q.EntryDate).FirstOrDefault().DateStart <= currentDate
)
.ToList().Select(x => {
return x; //Breakpoint here
}).ToList();
我希望我可以使用第一个工作示例,但是.ToList()之后的任何内容都没有加载到上下文中,所以第一个示例会导致所有"活动"的集合。
为什么会这样?我该如何解决?
感谢
Select
函数内的函数lambda,因为(注意!)它没有在应用程序中执行。实体框架将此表达式转换为SQL表达式,然后在SQL server中执行。
当您添加对ToList
函数的调用时,它会强制EF执行查询并返回结果。正如您所知,ToList
返回一个List<T>
,因此Select
在您的应用程序中执行,您可以使用断点中断它。
context.campaigns.Where(/*condition*/).Select(/*selector*/); // returns IQueryable<T>
// IQueryable is translated into a SQL statement
var campaigns = context.campaigns.Where(/*condition*/).ToList(); // Returns List<T>
campaign.Select(/*selector*/); // campaign is a List<T>, and Select is not not translated to SQL, but executed directly