是否可以加载不包含某些属性的实体?这个实体的一个属性选择起来很昂贵。我想懒加载这个属性。这可能吗?
答案 0 :(得分:36)
既然你已经阅读了所有人的回复,我会给你正确答案。 EF不支持延迟加载属性。然而,它确实支持了一个非常强大的概念。它被称为表拆分,您可以将表映射到两个实体。假设数据库中的产品表可以映射到产品实体和ProductDetail实体。然后,您可以将昂贵的字段移动到ProductDetail实体,然后在prodcut和productdetail实体之间创建1..1关联。然后,您可以在需要时延迟加载productdetail关联。 在我的书的性能章节中,我有一个名为的食谱。 13-9。将昂贵的财产转移到另一个实体
希望有所帮助!
答案 1 :(得分:6)
使用标量属性,选择性地不加载某个属性的唯一方法是在ESQL或L2E中投影:
var q = from p in Context.People
select new
{
Id = p.Id,
Name = p.Name // note no Biography
};
+1丹;懒惰地做这个比预先加载它更糟糕。如果你想控制加载,请明确。
答案 2 :(得分:1)
刺激是正确的,但在使用延迟加载时要小心。您可能遇到性能问题,并且没有意识到属性已在代码中的特定位置加载。这是因为它在您使用属性
时加载数据我更喜欢使用显式加载。通过这种方式,您可以了解何时加载以及何处加载这是一个链接,给出了LoadProperty http://sankarsan.wordpress.com/2010/05/09/ado-net-entity-framework-data-loading-part-2/
的示例您也可以使用Include方法预先加载。示例:http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework
答案 3 :(得分:1)
给定对EntityFramework DbSet的查询,其中目标实体包含BigProperty和SmallProperty, 当您尝试仅在不将BigProperty加载到内存中时访问SmallProperty:
//this query loads the entire entity returned by FirstOrDefault() in memory
//the execution is deferred during Where; the execution happens at FirstOrDefault
db.BigEntities.Where(filter).FirstOrDefault()?.SmallProperty;
//this query only loads the SmallProperty in memory
//the execution is still deferred during Select; the execution happens at FirstOrDefault
//a subset of properties can be selected from the entity, and only those will be loaded in memory
db.BigEntities.Where(filter).Select(e=>e.SmallProperty).FirstOrDefault();
因此,您可以利用此行为仅查询实际需要它的BigProperty,并使用select语句在其他任何位置显式过滤掉它。
我使用Visual Studio调试诊断工具中的内存使用功能对此进行了测试。