我在懒惰加载方面遇到了一个问题。为此,我将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,查询本身也会导致从数据库中获取所有包含的表的所有属性(包括我们的示例密码中的敏感信息)以及一次在代码中它只会过滤名称。
任何人都可以就这两种中最佳做法提供一些建议吗?或者是否有任何其他方式的急切加载而不加载所有属性。请不要使用存储过程。
提前致谢,
彼得
答案 0 :(得分:0)
是否使用延迟加载或急切加载。这实际上取决于您的用户将更频繁地做什么。如果你的用户最终触摸你的地图参考超过50%(*我不确定什么是一个很好的百分比,但让我们继续这个),那么你应该急切加载。否则,你应该使用延迟加载。百分比应该根据负载产生的成本而变化。
但是,除非你确实遇到问题,否则我会说大多数ORM的默认行为(延迟加载)。坚持KISS第一格言。 :)
这至少只是我的两分钱:)。