是否可以加载实体并排除某些属性?其中一个属性的选择成本很高。我想延迟加载该属性。这可能吗?
是否可以加载实体并排除某些属性?其中一个属性的选择成本很高。我想延迟加载该属性。这可能吗?
现在您已经阅读了每个人的回复,我会给您正确的答案。EF不支持属性的惰性加载。然而,它支持比这更强大的概念。它被称为表拆分,您可以将一个表映射到两个实体。例如,数据库中的产品表可以映射到产品实体和ProductDetail实体。然后,您可以将昂贵的字段移动到ProductDetail实体,然后在产品和ProductDetail实体之间创建一个1..1关联。然后,只有当您需要时才能惰性加载productdetail关联。
在我的书的性能章节中,我有一个名为13-9. 将昂贵的属性移动到另一个实体 的配方。
希望能对您有所帮助!
使用标量属性,选择性地不加载某个属性的唯一方法是在ESQL或L2E中进行投影:
var q = from p in Context.People
select new
{
Id = p.Id,
Name = p.Name // note no Biography
};
+1 给 Dan;懒加载比预加载更糟,如果你想要控制加载,请明确指出。
假设您在EntityFramework DbSet上执行一个查询,其中目标实体包含一个BigProperty和一个SmallProperty, 当您尝试仅访问SmallProperty而不在内存中加载BigProperty时:
//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();
stimms 是正确的,但在使用延迟加载时要小心。您可能会遇到性能问题,并且不会意识到属性正在在代码的特定位置加载数据。这是因为它在使用属性时加载数据。
我更喜欢使用显式加载。这样,您就知道何时以及在哪里加载它们。这里有一个链接,提供了 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