[英]Entity Framework - Deleting Split entity is not attached and it was not loaded by the same context instance
[英]Entity Framework context is incorrectly loaded
在下面的代码片段中,我将一个brakpoint放置在select的返回位置。
在这种情况下,断点被正确命中
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.