首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF:如何进行有效的延迟加载(不是1+N选择)?

EF:如何进行有效的延迟加载(不是1+N选择)?
EN

Stack Overflow用户
提问于 2010-10-22 12:54:11
回答 2查看 308关注 0票数 2

从实体列表开始,通过关联需要所有依赖实体,是否有一种方法可以使用相应的导航-属性加载所有子实体的一个db-往返?即。通过导航属性生成单个WHERE fkId IN (...)语句?

更多细节

我找到了这些方法让孩子们:

  1. 将父实体的集合保持为IQueriable
代码语言:javascript
复制
- Not good since the db will have to find the main set every time and join to get the requested data.

  1. 将父对象放入数组或列表中,然后通过导航属性获取相关数据。 var children = parentArray.Select(p => p.Children).Distinct()
代码语言:javascript
复制
- This is slow since it will generate a select for every main-entity.
- Creates duplicate objects since each set of children is created independetly.

  1. 将主实体中的外键放入数组中,然后过滤整个依赖对象集。 var foreignKeyIds = parentArray.Select(p => p.Id).ToArray(); var children = Children.Where(d => foreignKeyIds.Contains(d.Id)) Linq然后生成所需的"WHERE foreignKeyId IN (.)“-clause。
代码语言:javascript
复制
- This is fast but only possible for 1:\*-relations since linking-tables are mapped away.  
- Removes the readablity advantage of EF by using Ids after all
- The navigation-properties of type EntityCollection<T> are not populated

  1. 通过.Include()-methods进行紧急加载,包括完整性(请求延迟加载)
代码语言:javascript
复制
- Alledgedly joins everything included together and returns one giant flat result.
- Have to decide up front which data to use

有什么方法可以使2的简单性达到3的性能吗?

EN

回答 2

Stack Overflow用户

发布于 2011-05-04 07:42:22

您可以将父对象附加到上下文中,并在需要时获取子对象。

代码语言:javascript
复制
foreach (T parent in parents) {
    _context.Attach(parent); 
} 
var children = parents.Select(p => p.Children);

编辑:用于附加多个,只需迭代。

票数 0
EN

Stack Overflow用户

发布于 2011-11-15 08:14:13

我认为找一个好的答案是不可能的,或者至少不值得麻烦。相反,像脱衣舞这样的微ORM提供了很大的好处,消除了在sql列和对象属性之间映射的需要,并且不需要首先创建模型。另外,只需编写所需的sql,而不是理解要编写哪些linq才能生成它。不过,我们会想念IQueryable<T>的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3996959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档