最佳实践:延迟加载或获取所有属性

时间:2012-03-28 17:20:46

标签: nhibernate lazy-loading eager-loading

我在懒惰加载方面遇到了一个问题。为此,我将LinQ用于NHibernate,但我认为它也适用于其他LINQ to XX方法。

想象一下用户表格,其中包含以下列:

ID 名称 地址 密码(对于此示例:plain,not hashed)

想象一下角色表:

ID 名称

当然,还有多对多表 UserRole (包含CreateDate等附加信息)。

当您只想获得特定用户角色名称时,您可以通过急切加载来执行此操作,使用以下查询:

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 } );

预先加载的优点:每次只有1次调用,而不是对数据库进行2次或3次调用 急切加载的缺点:即使你说你只想要返回Name,查询本身也会导致从数据库中获取所有包含的表的所有属性(包括我们的示例密码中的敏感信息)以及一次在代码中它只会过滤名称。

任何人都可以就这两种中最佳做法提供一些建议吗?或者是否有任何其他方式的急切加载而不加载所有属性。请不要使用存储过程。

提前致谢,

彼得

1 个答案:

答案 0 :(得分:0)

是否使用延迟加载或急切加载。这实际上取决于您的用户将更频繁地做什么。如果你的用户最终触摸你的地图参考超过50%(*我不确定什么是一个很好的百分比,但让我们继续这个),那么你应该急切加载。否则,你应该使用延迟加载。百分比应该根据负载产生的成本而变化。

但是,除非你确实遇到问题,否则我会说大多数ORM的默认行为(延迟加载)。坚持KISS第一格言。 :)

这至少只是我的两分钱:)。