C# NHibernate,使用QueryOver w/Future获取孙辈收藏

C# NHibernate,使用QueryOver w/Future获取孙辈收藏,c#,nhibernate,C#,Nhibernate,我试图检索父实体的所有集合(非笛卡尔积),但不知道如何获取子实体。表结构如下所示: 下面的代码获取my parent及其Child1和Child2集合,以及其ParentChild3集合,但我不知道如何构造查询以获取Child3孙子(并将它们延迟到Future()) var parent=\u会话 .QueryOver() .其中(x=>x.Id==Id) .Future(); var children1=\u会话 .QueryOver() .其中(x=>x.Id==Id) .Fetch(x=

我试图检索父实体的所有集合(非笛卡尔积),但不知道如何获取子实体。表结构如下所示:

下面的代码获取my parent及其Child1和Child2集合,以及其ParentChild3集合,但我不知道如何构造查询以获取Child3孙子(并将它们延迟到Future())

var parent=\u会话
.QueryOver()
.其中(x=>x.Id==Id)
.Future();
var children1=\u会话
.QueryOver()
.其中(x=>x.Id==Id)
.Fetch(x=>x.Children1)
.Future();
var children2=\u会话
.QueryOver()
.其中(x=>x.Id==Id)
.Fetch(x=>x.Children2)
.Future();
var parentChildren3=\u会话
.QueryOver()
.其中(x=>x.Id==Id)
.Fetch(x=>x.ParentChildren3)。渴望
.Future();
//现在,如何获得孩子3?
返回parent.SingleOrDefault();

半相关:这是获得所有收藏的最佳方式吗?使用通过联接获取结果的查询是否更好(并且可能)?

如何获取子项3:

ParentChildren alias = null;
var parentChildren3 =_session
    .QueryOver<Parent>()
    .Where(x => x.Id == id)
    .JoinAlias(x => x.ParentChildren3, () => alias)
    .Fetch(() => alias.Children3).Eager
    .Future<Parent>();
ParentChildren别名=null;
var parentChildren3=\u会话
.QueryOver()
.其中(x=>x.Id==Id)
.JoinAlias(x=>x.ParentChildren3,()=>alias)
.Fetch(()=>别名.Children3).急切
.Future();
半相关:这是我所知道的最好的方法

如果ParentChild表没有其他列,则可以将其映射为标准的manytomany。NHibernate将不需要链接表的实体,并且即时抓取将更容易。

尝试以下方法:

var parentChildren3 =
        _session
            .QueryOver<Parent>()
            .Fetch(x => x.ParentChildren3).Eager
            .Fetch(x => x.ParentChildren3.First().Child3).Eager
            .Where(x => x.Id == id)
            .Future<Parent>();
var parentChildren3=
_会议
.QueryOver()
.Fetch(x=>x.ParentChildren3)。渴望
.Fetch(x=>x.ParentChildren3.First().Child3).Eager
.其中(x=>x.Id==Id)
.Future();

正如在本论坛帖子中所解释的:

不幸的是,我必须将其映射为复合(虽然这一个没有有效负载列,但其他人有),因此我无法避开很多。
var parentChildren3 =
        _session
            .QueryOver<Parent>()
            .Fetch(x => x.ParentChildren3).Eager
            .Fetch(x => x.ParentChildren3.First().Child3).Eager
            .Where(x => x.Id == id)
            .Future<Parent>();