首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最佳实践:延迟加载或获取所有属性

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

Stack Overflow用户
提问于 2012-03-28 17:20:45
回答 1查看 605关注 0票数 0

我有个问题是关于懒惰装货的。为此,我将LinQ用于NHibernate,但我假设它也适用于其他LINQ方法。

假设有一个带有列的用户表:

ID名称地址密码(在本例中:普通,而不是散列)

并设想一个角色表:

ID名

当然,还有多到多的表UserRole (还有CreateDate之类的附加信息)。

当您只想获取特定的eager-loading用户的rolesnames时,可以使用以下查询通过进行此操作:

代码语言:javascript
复制
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

代码语言:javascript
复制
var roles = session.Query<User>().Single(u => u.Id == userId)
                                .UserRoles.Select(ug => new { ug.Role.Name } );

急切加载的优点:每次只调用一个调用,而不是对数据库进行2或3个调用,这是急切加载的缺点:即使您说只希望返回名称,查询本身也将导致从数据库中获取所有包含的表的所有属性(包括我们示例中的密码中的敏感信息),并且一旦进入您的代码,它将只过滤名称。

有人能就这两种中哪一种最好的练习给出一些建议吗?或者是否还有其他方法可以在不加载所有属性的情况下进行紧急加载。请不要建议使用存储过程。

提前谢谢你,

彼得

EN

回答 1

Stack Overflow用户

发布于 2012-03-28 17:26:18

关于是否使用延迟加载或紧急加载。这实际上取决于您的用户将更经常地做什么。如果您的用户最终接触到您的映射引用超过50% (*我不确定什么是好百分比,但让我们用这个)的时间,那么您应该去急于加载。否则,您应该使用延迟加载。百分比可能会根据负载所产生的成本而有所不同。

但是,我想说的是,除非您实际遇到了问题,否则应该使用大多数ORM(延迟加载)的默认行为。坚持接吻的第一座右铭。:)

这至少是我的两分钱:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9912568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档