选择一个到多个左连接

选择一个到多个左连接

本文介绍了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:

    这篇关于NHibernate:选择一个到多个左连接 - 从父节点获取X最新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-21 00:29