我有个问题是关于懒惰装货的。为此,我将LinQ用于NHibernate,但我假设它也适用于其他LINQ方法。
假设有一个带有列的用户表:
ID名称地址密码(在本例中:普通,而不是散列)
并设想一个角色表:
ID名
当然,还有多到多的表UserRole (还有CreateDate之类的附加信息)。
当您只想获取特定的eager-loading用户的roles的names时,可以使用以下查询通过进行此操作:
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 } );Lazy-loading
var roles = session.Query<User>().Single(u => u.Id == userId)
.UserRoles.Select(ug => new { ug.Role.Name } );急切加载的优点:每次只调用一个调用,而不是对数据库进行2或3个调用,这是急切加载的缺点:即使您说只希望返回名称,查询本身也将导致从数据库中获取所有包含的表的所有属性(包括我们示例中的密码中的敏感信息),并且一旦进入您的代码,它将只过滤名称。
有人能就这两种中哪一种最好的练习给出一些建议吗?或者是否还有其他方法可以在不加载所有属性的情况下进行紧急加载。请不要建议使用存储过程。
提前谢谢你,
彼得
发布于 2012-03-28 17:26:18
关于是否使用延迟加载或紧急加载。这实际上取决于您的用户将更经常地做什么。如果您的用户最终接触到您的映射引用超过50% (*我不确定什么是好百分比,但让我们用这个)的时间,那么您应该去急于加载。否则,您应该使用延迟加载。百分比可能会根据负载所产生的成本而有所不同。
但是,我想说的是,除非您实际遇到了问题,否则应该使用大多数ORM(延迟加载)的默认行为。坚持接吻的第一座右铭。:)
这至少是我的两分钱:)
https://stackoverflow.com/questions/9912568
复制相似问题