NHibernate:Lazyload单一属性

时间:2009-12-06 15:28:42

标签: nhibernate lazy-loading

我目前已将我的blogengine从Linq2Sql移到NHIbernate。

我遇到了以下性能问题: 我有一个表:'帖子',有Id,Title,PostContent,DateCreated列等等。

问题在于,当我创建“最近的帖子列表”时,我不想要整个PostContent

在Linq2Sql中,您可以在单个属性上设置延迟加载,因此在您实际请求该属性之前,它不会成为SQL查询的一部分。

我尝试用Fluent NHibernate来做这件事:

Map(x => x.PostContent).LazyLoad();

没有成功。谷歌搜索似乎NHibernate不支持这个,所以我的问题是,我该如何解决这个问题?

如果不将内容移动到单独的表中,是否真的无法延迟加载我的属性?

提前致谢!

3 个答案:

答案 0 :(得分:3)

以下是如何实现您想要的(延迟加载但不一样)

var posts = NHibernateSessionManager.Session.CreateQuery("Select p.Id as Id, p.Title as Title, p.DateCreated as DateCreated from Post p")
                .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(Post)))
                .List<Post>();

AliasToBean的用途是,为特定列(通常来自多个实体)选择并返回强类型集合而不是System.Object []。

现在,如果您的Bean(类)是您的Post类,那么它将仅仅在请求的列中弹出该类,而不是其他任何内容。

你将不会拥有NHibernate托管对象的集合。返回列表中的所有帖子都是分离的非受控对象。

对于“获取所有最近的帖子”而不必获取实体的最“重量级”列而不必创建其他类来转换数据,上述解决方案是完美的。

查看此信息以获取更多信息: NHibernate: returning a strongly typed list having applied an aggregate function

答案 1 :(得分:3)

答案 2 :(得分:0)

当PostContent映射到同一个表时,这是不可能的,因为在99%的情况下性能差异不显着。当你在1%时,你可以考虑使用handbuild sql而不是orm来处理那种情况。

据我所知,使用linq to sql(开箱即用)完全无法进行Lazy / Eager加载。

您可以使用要选择的数据创建不同的类,只需将该数据选择到新对象中。