Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用LINQ to entity覆盖匿名类型上的延迟加载_Linq_Entity Framework - Fatal编程技术网

使用LINQ to entity覆盖匿名类型上的延迟加载

使用LINQ to entity覆盖匿名类型上的延迟加载,linq,entity-framework,Linq,Entity Framework,我有三个实体由实体框架生成。一个是event,它包含名为frogs和user\u bookings的导航属性。我之前发布了一个关于执行子查询的相关问题,该子查询似乎有效,但它阻止我覆盖属性的延迟加载 var evts = from evt in context.events.Include("frogs") where evt.event_id < 10 select evt; 我在尝试访问青蛙时出错,因为ObjectContext不再存在。我

我有三个实体由实体框架生成。一个是
event
,它包含名为
frogs
user\u bookings
的导航属性。我之前发布了一个关于执行子查询的相关问题,该子查询似乎有效,但它阻止我覆盖属性的延迟加载

var evts = from evt in context.events.Include("frogs")
           where evt.event_id < 10
           select evt;

我在尝试访问青蛙时出错,因为ObjectContext不再存在。我尝试从
事件
类的类定义中删除virtual,但这只会导致一个青蛙的空列表,而青蛙肯定在那里

这是<当查询结果是投影时,即使投影包含可能包含
Include
d属性的实体,也会忽略code>Include

我不知道EF为什么要这么做。如果投影不包含任何实体,但只是某种类型(匿名或非匿名),则不存在
Include
target,因此忽略它是有意义的。但是,如果投影确实包含一个
包含
目标(
事件
,在您的情况下),那么在我看来,他们可能已经决定让它工作。但是,他们没有

也许这是因为当
包含
时,规则实际上起到了作用。在您的例子中,查询的形状在
Include
之后发生变化,因此它被忽略

您还可以通过查询青蛙来解决这个问题:

from evt in context.events.Include("frogs")
where evt.event_id < 10
select new
{
   Event = evt,
   Frogs = evt.frogs,
   HasBooked = evt.user_bookings.Any(x => x.user_id == 1)
};
来自上下文中的evt.events.Include(“青蛙”)
其中evt.event_id<10
选择新的
{
事件=evt,
青蛙=evt.青蛙,
HasBooked=evt.user\u bookings.Any(x=>x.user\u id==1)
};
现在,每个
事件
也将填充其
青蛙
集合(因为关系修复)。但有两个陷阱。集合未标记为已加载,因此-

  • 如果延迟加载可以在之后发生,它将发生,使初始加载无效
  • 如果延迟加载不能再发生(因为上下文已被释放),您将得到一个异常

这意味着您必须禁用延迟加载。因为ObjectContext不再存在。为什么会这样?当然不是因为这里贴了一些代码。是的,我想我知道为什么会出现这个消息。当我为显示数据的视图请求数据时,数据正试图被提取,此时数据已被处理。我的问题是,我需要做什么才能让它在第二个选项的查询时加载数据?我知道我可以在第一个示例中添加
include
,但这对第二个示例不起作用,因此我猜测在添加
select new
部分时,它不在正确的位置。谢谢-这是一个非常详细和有用的解释。
from evt in context.events.Include("frogs")
where evt.event_id < 10
select new
{
   Event = evt,
   Frogs = evt.frogs,
   HasBooked = evt.user_bookings.Any(x => x.user_id == 1)
};