NHibernate查询与子查询的连接

NHibernate查询与子查询的连接,nhibernate,join,orm,queryover,Nhibernate,Join,Orm,Queryover,有人知道如何使用NHibernate QueryOver生成以下sql查询吗 挑选 此Id为Id2\u 1\u, 此名称为名称2\u 1\u, 此.rp\u id为rp3\u 2\u 1\u, rtlprd1_u0.Id作为Id3_0, rtlprd1。名称为name3\u 0_ 从…起 收到这个_ 左外连接 rtl_珠三角rtlprd1_ 在这个u.rp_id=rtlprd1_u.id上 左连接选择 按代码映射: class Receipt { public virtual int I

有人知道如何使用NHibernate QueryOver生成以下sql查询吗

挑选 此Id为Id2\u 1\u, 此名称为名称2\u 1\u, 此.rp\u id为rp3\u 2\u 1\u, rtlprd1_u0.Id作为Id3_0, rtlprd1。名称为name3\u 0_ 从…起 收到这个_ 左外连接 rtl_珠三角rtlprd1_ 在这个u.rp_id=rtlprd1_u.id上 左连接选择

按代码映射:

class Receipt
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual RtlPrd RtlPrd { get; set; }
    public virtual JoinClass JoinClass { get; set; }

}
class ReceiptMap : ClassMapping<Receipt>
{
    public ReceiptMap()
    {
        Table("receipt");
        Id(x => x.Id);
        Property(x => x.Name, m => m.Column("name"));
        ManyToOne(x => x.RtlPrd, m =>
        {
            m.Column("rp_id");
            m.Cascade(Cascade.None);
        });
        ManyToOne(x => x.JoinClass, m =>
        {
            m.Column("rp_id");
            m.Cascade(Cascade.None);
        });
    }
}
class RtlPrd
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}
class RtlPrdMap : ClassMapping<RtlPrd>
{
    public RtlPrdMap()
    {
        Table("rtl_prd");
        Id(x => x.Id);
        Property(x => x.Name, m => m.Column("name"));
    }
}
class LnkPrdType
{
    public virtual int LptId { get; set; }
    public virtual string Name { get; set; }
}
class LnkPrdTypeMap : ClassMapping<LnkPrdType>
{
    public LnkPrdTypeMap()
    {
        Table("lnk_prd_type");
        Id(x => x.LptId, m => m.Column("lpt_id"));
        Property(x => x.Name, m => m.Column("name"));
    }
}
class LnkPrd
{
    public virtual int LpId { get; set; }
    public virtual string Name { get; set; }
    public virtual LnkPrdType LnkPrdType { get; set; }
    public virtual RtlPrd RtlPrd { get; set; }

}

class LnkPrdMap : ClassMapping<LnkPrd>
{
    public LnkPrdMap()
    {
        Table("lnk_prd");
        Id(x => x.LpId, m => m.Column("lp_id"));
        Property(x => x.Name, m => m.Column("name"));
        ManyToOne(x => x.LnkPrdType, m =>
        {
            m.Column("lpt_id");
            m.Cascade(Cascade.None);
        });
        ManyToOne(x => x.RtlPrd, m =>
        {
            m.Column("rpt_id");
            m.Cascade(Cascade.None);
        });
    }
}

class JoinClass
{
    public virtual int Id { get; set; }
}

class JoinClassMap : ClassMapping<JoinClass>
{
    public JoinClassMap()
    {
        // TODO: need add WHERE condtion in subselect
        Subselect(@"SELECT lp.lp_id
                    FROM lnk_prd lp JOIN lnk_prd_type lpt ON lp.lpt_id = lpt.lpt_id");

        Id(x => x.Id, m => m.Column("lp_id"));
    }
}

NHibernate是ORM工具,支持CRUD和映射实体模型之上的强大查询。在这种情况下,我们必须使用一些特殊的方法,如下所示

我们经常使用的一种方法是使用原始SQL查询。见:

甚至 小城市 下面显示了如何通过AddEntity从本机SQL查询中获取实体对象:

本例中的另一个选项是创建新的虚拟/只读实体,并将它们映射到经过调整的视图。NHibernate支持内联视图定义,因此我们可以在不更改底层数据库的情况下管理它

这可以是一个例子:

<class name="Cat"  lazy="true" dynamic-update="true" batch-size="25" >

    <subselect>
      SELECT CatId
      , Name
      , Age
      , ParentId
      FROM [animals].[Cat]
    </subselect>

    <cache usage="read-write" ... />
    <id name="ID" column="CatId" .. />
    <many-to-one name="Parent"...  />
    ...

正如我们所看到的,如果能看到您的映射以及您所做的尝试,我们将非常高兴。另外,您应该知道,没有办法在选择上创建联接。。。除非此选择映射为某个实体。有时,您可以使用子查询来重新表述它。这两个链接应该可以帮助您了解这项技术:我需要通过连接另外两个实体创建的子集中的一些数据。如果子集是实体,则更容易。但就我而言,它不允许这样做。你知道解决这个问题的办法吗?看,没那么难。我可以理解您不能更改DB,但是您可以根据需要创建任意多的C实体。其中一些可以是只读的,构建在不可编辑的视图之上。如果存在映射的不动产,那么这些可以很容易地用于QueryOver。因此,我建议:1创建实体,表示业务模型2使用视图/选择映射它们3映射它们之间的多对一关系4创建简单查询。。。如果您以后在该过程中遇到一些问题,请在此处显示。您肯定会得到帮助我想知道是否有任何方法可以创建2个实体的视图或类似的东西,用于在NHibernate中使用queryover进行连接,而无需在DB中更改或创建视图?我起草了一些关于如何处理您的问题的想法。希望这有助于了解如何在这种情况下使用NHibernate。。
session
   .CreateSQLQuery("SELECT * FROM CATS")
   .AddEntity(typeof(Cat));
<class name="Cat"  lazy="true" dynamic-update="true" batch-size="25" >

    <subselect>
      SELECT CatId
      , Name
      , Age
      , ParentId
      FROM [animals].[Cat]
    </subselect>

    <cache usage="read-write" ... />
    <id name="ID" column="CatId" .. />
    <many-to-one name="Parent"...  />
    ...