【问题标题】:How to call a procedure using NHibernate that returns result from multiple tables?如何使用 NHibernate 调用从多个表返回结果的过程?
【发布时间】:2011-01-07 07:52:46
【问题描述】:

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

例如(表格):
[用户]
user_id - PK
姓名

[交易]
user_id - FK
item_id
数量

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

公共类交易
{
公共字符串用户ID {get;设置;}
公共字符串 ItemID {get;设置;}
公共小数金额{get;设置;}
}

但是由于优化问题,有时在查询结果时需要进行一些操作;我们通常使用从多个表返回结果的存储过程。 如果我们使用上面的例子;我们如何调用从连接表返回结果的过程?是否可以不创建一个新的类和绑定只是为了这个组合记录?

谢谢!

【问题讨论】:

    标签: nhibernate stored-procedures multiple-tables


    【解决方案1】:

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

    <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>
    

    此示例假定 Transactions 被映射为 User 类上的包。您将在 C# 中按如下方式使用此查询:

    IList<User> users = session
        .GetNamedQuery("LoadUsersAndTransactions")
        .SetString("param_1", parameterValue1)
        ...
        .SetString("param_N", parameterValueN)
        .List<User>();
    

    关于自定义 SQL 查询用法的 NHibernate 文档是 here

    干杯, 格克。

    【讨论】:

    • 还有更多相当复杂的自定义 SQL 映射示例可以在nhibernate.svn.sourceforge.net/viewvc/nhibernate/trunk/…找到更多相当复杂的自定义 SQL 映射示例
    • 谢谢!但是我怎样才能在对象列表(用户和事务类)中得到结果?抱歉,在 NHibernate 中还是新的。我想我可以使用 GetNamedQuery 但是我需要调用什么方法来获得结果?
    • 很抱歉回复晚了。我只是对我的帖子稍作修改尝试过;我使用 Profile 而不是 Transaction。我还使用了联合查询而不是过程(同时)。仅使用 return xml 元素,但当我包含 return-join xml 元素时,查询工作正常。它只是在调用 BuildSessionFactory 方法时崩溃。
    • 能否提供异常详情?
    • 我用它做了一个工作,但我不确定它是否是正确的方法。将重新创建项目,我刚从这里开始我的新工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多