C# NHibernate从多个表中进行简单选择
我得到了以下表格:C# NHibernate从多个表中进行简单选择,c#,nhibernate,orm,hql,queryover,linq-to-nhibernate,C#,Nhibernate,Orm,Hql,Queryover,Linq To Nhibernate,我得到了以下表格: table X(CODE, FLAGGED, ENTRY_DATE) table Y(ID, CODE) table Z(ID, FIRST_NAME, LAST_NAME) 以及下列类别: public class Xclass { public virtual string Code { get; set; } public virtual bool IsFlagged { get; set; } public virtual DateTime
table X(CODE, FLAGGED, ENTRY_DATE)
table Y(ID, CODE)
table Z(ID, FIRST_NAME, LAST_NAME)
以及下列类别:
public class Xclass
{
public virtual string Code { get; set; }
public virtual bool IsFlagged { get; set; }
public virtual DateTime EntryDate { get; set; }
}
public class Yclass
{
public virtual string Id { get; set; }
public virtual string Code { get; set; }
}
public class Zclass
{
public virtual string Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
使用以下映射:
<class name="Xclass">
<id name="Code" />
<property name="IsFlagged" />
<property name="EntryDate" />
</class>
<class name="Yclass">
<id name="Id" />
<property name="Code" />
</class>
<class name="Zclass">
<id name="Id" />
<property name="FirstName" />
<property name="LastName" />
</class>
我是新来的NHibernate
,我读过关于QueryOver
,JoinAlias
/JoinQueryOver
。
但我似乎找不到任何能为我指明正确方向的东西。
任何反馈都将不胜感激。ORM通常用于建模类之间的关系,然后使用它们。在这里,您没有任何建模。但仍然可以执行所需的查询:
var query = session.CreateQuery(@"
select x.Code, z.FirstName, z.LastName
from Xclass x, Yclass y, Zclass z
where x.IsFlagged = :flagged
and x.Code = y.Code
and y.Id = Z.Id")
.SetBoolean("flagged", true);
var results = query.ToList();
这将产生一个对象数组列表。如果要将它们投影到类型化类中,请使用结果转换器,例如:
var results = query
.SetResultTransformer(
Transformers.AliasToBean<ADtoWithPropertiesNamedAsQueryColumnAliases>())
.List<ADtoWithPropertiesNamedAsQueryColumnAliases>();
var results=query
.SETRESULT变压器(
Transformers.AliasToBean。这通常确保您的查询在应用程序引导时得到验证,而不必在代码中使用原始HQL查询测试每个功能。如果命名查询中出现错误,则如果启用了该查询,则会显示错误的详细信息
在下的映射中,添加:
并将CreateQuery(@“…”)
替换为GetNamedQuery(“YourQueryName”)
对于使用其他查询API,在大多数情况下,您必须映射表之间的关系。在这里,您的主键上似乎有一个介于Y
和Z
之间的关系。如果确实如此,请映射它,然后您将能够导航与或的关系,并从关系中选择数据
对于code
上的关系,您也可以将其映射,前提是code
是某个表中的唯一键,可能是X
,可能是Y
,或者类似的W
。在code
唯一的表上,最好将其映射为a。然后声明与该表的关系,同时指定pproperty ref
指向code
(也包括列
,除非名称
也是code
)。从该表中声明关系,使用属性ref
on键指定映射在code
上完成(否则默认为主键)。
由于您的查询可以选择Y.code
而不是X.code
,并且查询api允许在where条件下使用子查询,因此您可以避免映射X
和Y
之间的关系,而只需使用子查询过滤Y
。谢谢您的额外解释。这非常有用。我正在开发一个遗留后端,可能需要调整一些关系以改进整体结构。@janonimus,如果您需要,我已经添加了一些关于更好地使用HQL的解释。
var results = query
.SetResultTransformer(
Transformers.AliasToBean<ADtoWithPropertiesNamedAsQueryColumnAliases>())
.List<ADtoWithPropertiesNamedAsQueryColumnAliases>();