使用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)
};