如何使用NHibernate调用从多个表返回结果的过程?

如何使用NHibernate调用从多个表返回结果的过程?,nhibernate,stored-procedures,multiple-tables,Nhibernate,Stored Procedures,Multiple Tables,通常我们为每个表类创建1:1映射 Ex(表格): [用户] 用户id-主键 名称 [交易] 用户标识-FK 项目id 金额 映射示例: 公共类用户 { 公共字符串ID{get;set;} 公共字符串名称{get;set;} } 公共类事务 { 公共字符串用户标识{get;set;} 公共字符串ItemID{get;set;} 公共小数金额{get;set;} } 但出于优化考虑,有时在查询结果时需要进行操作;我们通常使用从多个表返回结果的存储过程。 如果我们使用上面的例子;如何调用从联接

通常我们为每个表类创建1:1映射

Ex(表格):
[用户]
用户id-主键
名称

[交易]
用户标识-FK
项目id
金额

映射示例:
公共类用户
{
公共字符串ID{get;set;}
公共字符串名称{get;set;}
}

公共类事务
{
公共字符串用户标识{get;set;}
公共字符串ItemID{get;set;}
公共小数金额{get;set;}
}

但出于优化考虑,有时在查询结果时需要进行操作;我们通常使用从多个表返回结果的存储过程。 如果我们使用上面的例子;如何调用从联接表返回结果的过程?不创建新的类和绑定,仅仅为了合并记录,这是可能的吗


谢谢

在这种情况下,可以使用存储过程,使用如下映射构造:

<sql-query name="LoadUsersAndTransactions" xml:space="preserve">
  <return class="User" alias="u">
    <return-property name="ID" column="user_id" />
    <return-property name="Name" column="name" />
  </return>
  <return-join property="u.Transactions" alias="t">
    <return-property name="key" column="user_id" />
    <return-property name="element" column="item_id" />
    <return-property name="element.id" column="item_id" />
    <return-property name="element.Amount" column="amount" />
  </return-join>
  EXEC dbo.SelectUsersAndTransactions :param_1, ..., :param_N
</sql-query>

EXEC dbo.selectUsers和Transactions:param_1,…,:param_N
本例假设事务映射为用户类上的包。您可以从C#按如下方式使用此查询:

IList用户=会话
.GetNamedQuery(“LoadUsersAndTransactions”)
.SetString(“参数1”,参数值1)
...
.SetString(“参数N”,参数valuen)
.List();
关于自定义SQL查询使用的NHibernate文档是

干杯,
格克

更多相当复杂的自定义SQL映射示例可以在上找到,更多相当复杂的自定义SQL映射示例可以在上找到,谢谢!但是如何在对象列表(用户和事务类)中获得结果呢?对不起,还是新来的。我想我可以使用GetNamedQuery,但是我需要调用什么方法来获得结果呢?很抱歉,响应太晚了。我只是在我的帖子上稍加修改后尝试了一下;我使用Profile而不是Transaction。我还使用了联接查询而不是过程(目前)。通过仅使用return-xml元素而不是包含return-join-xml元素,查询可以正常工作。它只是在调用方法BuildSessionFactory时崩溃。你能给出异常的详细信息吗?我用它做了一个解决方案,但我不确定它是否正确。将重新创建项目,我刚刚开始在这里我的新工作。
IList<User> users = session
    .GetNamedQuery("LoadUsersAndTransactions")
    .SetString("param_1", parameterValue1)
    ...
    .SetString("param_N", parameterValueN)
    .List<User>();