【问题标题】:Including child entities when running a sproc using Entity Framework V1使用 Entity Framework V1 运行存储过程时包括子实体
【发布时间】:2009-08-17 13:04:41
【问题描述】:

我继承了一些代码,我当前的任务是提高它的性能。我马上就注意到了一个包含延迟加载的子元素的 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 to 实体。)我还认为,如果我在调用 sproc 之前使用 Linq to Entities 加载子实体,那么上下文中的跟踪管理器将使用“身份” Map' 以识别已加载的实体,因此会发现当我调用 .Load() 时它不需要访问数据库。但是,我想我还必须在每个子引用上调用 .Attach() - 但这似乎很笨重,我还没有让它工作!!

有人知道我如何以最少的数据库往返次数为存储过程返回的实体加载对象图吗?

【问题讨论】:

    标签: .net entity-framework


    【解决方案1】:

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

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

    最后,另一种选择是在 LINQ 中进行项目,而不是使用 Include。结果将是相同的,但您可以预编译查询(使用 CompiledQuery),这样可以节省准备时间,如果您有很多包含并且重复运行查询,这可能会很重要。

    【讨论】:

    • 感谢您的回复。我已经尝试了第一个选项(因为我目前对实体框架的理解水平与我理解的差不多!!)并在“使用上下文”中添加(从 Child1 中的 c 选择 c).ToList() 并检查IsLoaded 在每个 Load 之前,但它仍然是 false 并且 Load() 执行。我不确定您如何将 .Include() 添加到存储过程中。我的想法是调用 .Attach() 并使用 Linq 到实体查询,该查询准确地选择所需的实体。
    • 当然,最后关于 .Attach() 的声明是垃圾,因为我想有效地针对实体集合而不是实体本身执行该操作:(
    猜你喜欢
    • 2016-03-19
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多