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

发布于 2024-10-10 18:55:35 字数 466 浏览 5 评论 0原文

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

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

[交易]
user_id - FK
item_id
金额

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

公共类交易
{
公共字符串用户ID {获取;设置;}
公共字符串 ItemID {get;设置;}
公共十进制金额 {get;设置;}
}

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

谢谢!

Normally we create 1:1 mapping per table-class.

Ex(Tables):
[users]
user_id - PK
name

[transactions]
user_id - FK
item_id
amount

Example mapping:
public class User
{
public string ID {get; set;}
public string Name {get; set;}
}

public class Transaction
{
public string UserID {get; set;}
public string ItemID {get; set;}
public Decimal Amount {get; set;}
}

But due to optimization concern and sometimes there are operations needed to be done while querying for results; we usually use stored procedures that returns result from multiple tables.
If we use the example above; how can we call a procedure that returns results from the joined tables? Is it possible without creating a new class and binding just for the sake of this combined records?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

闻呓 2024-10-17 18:55:35

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

<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 文档为 此处

干杯,
格尔克。

It is possible to use a stored procedure in this case, using a mapping construct like the following:

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

This example assumes that Transactions is mapped as a bag on the User class. You would use this query as follows from C#:

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

NHibernate documentation on usage of custom SQL queries is here.

Cheers,
Gerke.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文