繁体   English   中英

实体框架上下文未正确加载

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM