使用Entity Framework V1运行sproc时包含子实体

时间:2009-08-17 13:04:41

标签: .net entity-framework

我继承了一些代码,我目前的任务是提高它的性能。直接我注意到一个foreach循环包含延迟的子元素。我正在尝试删除延迟加载,因为在下面的示例中,将对数据库进行1 +(3 * n)次调用!

using (BaseEntityConnection BaseEntityContext = new BaseEntityConnection()) {
List<Parents> entities = BaseEntityContext.CallASproc(storeOrgLevelId, startDate, endDate).ToList<Parents>();
foreach (Parents entity in entities)
{
    entity.Child1Reference.Load();
    entity.Child2Reference.Load();
    entity.Child3Reference.Load();
}
}

我最初的想法转向使用.Include(),但是当我最初调用一个sproc时,我看不出这是怎么回事。 (假设暂时不能将sproc推广到Linq到实体。)我还认为如果我在调用sproc之前使用Linq将子实体加载到Entities,那么上下文中的跟踪管理器将使用'Identity映射'以识别已经加载的实体,因此在我调用.Load()时会发现它不需要命中数据库。但是,我想我也必须在每个子引用上调用.Attach() - 但这看起来很笨重,我还没有让它工作!!

有没有人知道如何为sproc返回的实体加载对象图,并且最少往返数据库?

1 个答案:

答案 0 :(得分:1)

首先,Load()总是命中数据库。但是,如果已经加载了相关实体,则不需要调用它,如果它已经加载到先前的相同上下文中,那么它将被加载。在调用Load()之前检查IsLoaded属性。

包含从SP返回的实体的作品。它将在SQL中的其他实体的源中加入,就像您可以“手动”一样。你试过吗?也就是说,如果SP结果集很大,调用Load几次比加入相关子实体可能更快。

最后,另一种方法是在LINQ中投影而不是使用Include。结果将是相同的,但您可以预编译查询(使用CompiledQuery),这将节省准备时间,如果您有大量包含并且重复运行查询,这可能很重要。