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>();