【发布时间】:2012-03-28 17:20:45
【问题描述】:
我有一个关于延迟加载的问题。为此,我使用 LinQ to NHibernate,但我认为它也适用于其他 LINQ to XX 方法。
想象一个带有列的用户表格:
身份证 姓名 地址 密码(本例中:普通密码,未散列)
想象一个角色表:
身份证 名称
当然,还有多对多表 UserRole(带有 CreateDate 等附加信息)。
当您只想获取特定用户的角色的名称时,您可以通过eager-loading 使用以下查询:
var roles = session.Query<User>().FetchMany(u => u.UserRoles)
.ThenFetch(ur => ur.Role)
.Single(u => u.Id == userId)
.UserRoles.Select(ug => new { ug.Role.Name } );
延迟加载:
var roles = session.Query<User>().Single(u => u.Id == userId)
.UserRoles.Select(ug => new { ug.Role.Name } );
Eager-loading 的优点:每次只有 1 次调用时,无需对数据库进行 2 或 3 次调用 急切加载的缺点:即使您说您只希望返回名称,查询本身也会导致从数据库中获取所有包含表的所有属性(包括我们示例密码中的敏感信息),并且一旦进入您的代码它只会过滤名称。
任何人都可以就这两个中的哪一个是最佳实践提供一些建议吗?或者有没有其他方法可以在不加载所有属性的情况下进行预加载。请不要就使用存储过程提出建议。
提前致谢,
彼得
【问题讨论】:
标签: nhibernate lazy-loading eager-loading