我目前已将我的blogengine从Linq2Sql移到NHIbernate。
我遇到了以下性能问题: 我有一个表:'帖子',有Id,Title,PostContent,DateCreated列等等。
问题在于,当我创建“最近的帖子列表”时,我不想要整个PostContent
。
在Linq2Sql中,您可以在单个属性上设置延迟加载,因此在您实际请求该属性之前,它不会成为SQL查询的一部分。
我尝试用Fluent NHibernate来做这件事:
Map(x => x.PostContent).LazyLoad();
没有成功。谷歌搜索似乎NHibernate不支持这个,所以我的问题是,我该如何解决这个问题?
如果不将内容移动到单独的表中,是否真的无法延迟加载我的属性?
提前致谢!
答案 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加载。
您可以使用要选择的数据创建不同的类,只需将该数据选择到新对象中。