C# 实体框架上下文加载不正确
在下面的代码片段中,我将在select的返回处放置一个制动点 在这种情况下,断点被正确命中C# 实体框架上下文加载不正确,c#,.net,entity-framework,C#,.net,Entity Framework,在下面的代码片段中,我将在select的返回处放置一个制动点 在这种情况下,断点被正确命中 context.campaigns .Include("adgroups") .Include("campaigntimeranges") .ToList()
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();
context.com
.包括(“广告集团”)
.包括(“活动时间范围”)
托利斯先生()
.Where(p=>p.LastUpdateq.EntryDate).FirstOrDefault().DateStart>=fromDate&&
p、 campaigntimeranges.OrderByDescending(q=>q.EntryDate).FirstOrDefault().DateStart{
返回x;//此处为断点
}).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();
context.com
.包括(“广告集团”)
.包括(“活动时间范围”)
.Where(p=>p.LastUpdateq.EntryDate).FirstOrDefault().DateStart>=fromDate&&
p、 campaigntimeranges.OrderByDescending(q=>q.EntryDate).FirstOrDefault().DateStart{
返回x;//此处为断点
}).ToList();
我希望我可以使用第一个有效的示例,但是.ToList()之后的任何内容都没有加载到上下文中,因此第一个示例将生成所有“活动”的集合
这是为什么?我该如何解决
感谢函数lambda inside
Select
函数未被调用,因为(注意!)它未在应用程序中执行。实体框架将此表达式转换为SQL表达式,然后在SQL server中执行
当您添加对ToList
函数的调用时,它强制EF执行查询并返回结果ToList
返回一个列表
,因此在应用程序中执行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
context.campeting.Where(/*条件*/)。选择(/*选择器*/);//返回IQueryable
//IQueryable被转换为SQL语句
var-campaings=context.campaings.Where(/*条件*/).ToList();//返回列表
活动。选择(/*选择器*/);//活动是一个列表,Select不会转换为SQL,而是直接执行
函数lambda insideSelect
函数未被调用,因为(注意!)它未在应用程序中执行。实体框架将此表达式转换为SQL表达式,然后在SQL server中执行
当您添加对ToList
函数的调用时,它强制EF执行查询并返回结果ToList
返回一个列表
,因此在应用程序中执行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
context.campeting.Where(/*条件*/)。选择(/*选择器*/);//返回IQueryable
//IQueryable被转换为SQL语句
var-campaings=context.campaings.Where(/*条件*/).ToList();//返回列表
活动。选择(/*选择器*/);//活动是一个列表,Select不会转换为SQL,而是直接执行
函数lambda insideSelect
函数未被调用,因为(注意!)它未在应用程序中执行。实体框架将此表达式转换为SQL表达式,然后在SQL server中执行
当您添加对ToList
函数的调用时,它强制EF执行查询并返回结果ToList
返回一个列表
,因此在应用程序中执行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
context.campeting.Where(/*条件*/)。选择(/*选择器*/);//返回IQueryable
//IQueryable被转换为SQL语句
var-campaings=context.campaings.Where(/*条件*/).ToList();//返回列表
活动。选择(/*选择器*/);//活动是一个列表,Select不会转换为SQL,而是直接执行
函数lambda insideSelect
函数未被调用,因为(注意!)它未在应用程序中执行。实体框架将此表达式转换为SQL表达式,然后在SQL server中执行
当您添加对ToList
函数的调用时,它强制EF执行查询并返回结果ToList
返回一个列表
,因此在应用程序中执行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
context.campeting.Where(/*条件*/)。选择(/*选择器*/);//返回IQueryable
//IQueryable被转换为SQL语句
var-campaings=context.campaings.Where(/*条件*/).ToList();//返回列表
活动。选择(/*选择器*/);//活动是一个列表,Select不会转换为SQL,而是直接执行
谢谢,你说得对,但我上面写的是为了测试东西。。真正的问题是,尽管我可以看到查询是正确的(由被命中的断点指示),但上下文中没有填充结果。Select
查询的一部分不能归咎于您没有得到结果。应该使用它来选择列,选择哪些行取决于Where
part。要对此进行调试,请打开SQL Server Profiler(SSMS工具菜单中有链接),开始监视并执行查询。当您在.NET中执行查询时,您应该在探查器中看到SQL语句。尝试在SSMS中手动执行它,并在那里调试为什么没有得到任何结果。谢谢,你是对的,但我上面写的是供我测试的