本文介绍了NHibernate:选择一个到多个左连接 - 从父节点获取X最新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下对象:
$ p $ 父
public virtual Guid Id {get;组; }
public virtual DateTime TimeStamp {get;组; }
公共虚拟IList< Child>孩子{get;组; }
小孩
公共虚拟Guid Id {get;组; }
public virtual string Name {get;组; }
我使用Fluent来映射一对多,如下所示:
.Override< Parent>(obj => obj.HasMany(x => x.Childs)
.Cascade.All()
.Not.Inverse()
.Not.KeyNullable()
.Not.KeyUpdate())
我需要通过TimeStamp获得所有父母与孩子之间的日期顺序。
我想这样做(maxCapacity是int ):
QueryOver< Parent>()其中(x => x.TimeStamp> from)
.And(x => x.TimeStamp&to).OrderBy(x => x.TimeStamp).Desc
.Left.JoinQueryOver< Child>(x => x.Childs)
.TransformUsing(new DistinctRootEntityResultTransformer())
.Take(maxCapacity).List();
由于 Take(maxCapacity)的结果不符合我的预期不是父结果,而是包含父和子的总查询结果。
如何获取最新的X已经转换的父行?
谢谢。
解决方案
$ b
- 加载根实体(Parent)和
- 的列表让NHibernate加载他们的孩子 - 分开的SQL查询。为避免1 + N问题,我们可以使用智能映射功能:
$ b p>So, the query should be like this:
session.QueryOver<Parent>() .Where(x => x.TimeStamp > from) .And(x => x.TimeStamp < to).OrderBy(x => x.TimeStamp).Desc //.Left.JoinQueryOver<Child>(x => x.Childs) // .TransformUsing(new DistinctRootEntityResultTransformer()) .Skip(start) // paging .Take(maxCapacity) .List<Parent>();
And the parent mapping should be like:
<class name="Parent"> ... <bag name="Childs" batch-size="3"> ... </bag> </class>
Please, check also these:
- How to Eager Load Associations without duplication in NHibernate?
- NHibernate QueryOver with Fetch resulting multiple sql queries and db hits
- Is this the right way to eager load child collections in NHibernate
这篇关于NHibernate:选择一个到多个左连接 - 从父节点获取X最新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!