实体框架上下文加载错误

本文关键字:错误 加载 上下文 框架 实体 | 更新日期: 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