NHibernate查询与子查询的连接
有人知道如何使用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上 左连接选择 按代码映射: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
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"... />
...