gpt4 book ai didi

nhibernate - 使用 NHibernate-Futures 获取 ManyToOne

转载 作者:行者123 更新时间:2023-12-02 00:14:53 26 4
gpt4 key购买 nike

我有一个类似于下面的类图。

我使用这个例子是因为它比解释我正在处理的领域更简单。

public class Cheque {

public FinanceAccount Account {get;set;}

public Customer customer {get;set;}

public Branch Branch {get;set;}
}

Cheque 实体与其余三个实体具有ManyToOne 关系。

目前的关系不是双向的

如何编写一个有效的 Futures 查询来获取 Cheques 列表,这样我就不会得到 N+1 来加载 AccountCustomer, 分支 ?

我试过使用左连接,但想知道这是否可以使用简化的 SQL 来完成

最佳答案

我们可以实现所需的结果(没有 N+1)——但 Futures 不是正确的 NHibernate 特性。我们可以使用它们,但是获取 many-to-one 实体的技巧在别处(见下文)。此处所述的 future :http://ayende.com/blog/3979/nhibernate-futures意思是:

... Future() 和 FutureValue() 本质上是一种推迟查询执行到以后的方式,此时 NHibernate 将获得有关应用程序应该做什么的更多信息, 并相应地对其进行优化

因此我们可以将更多查询放入一个批处理中。例如,查询可以是导致以下结果的一组查询:

  • 总计
  • 前 20 个检查预测
  • 上周提取的最大金额
  • 等等

因此,在这种情况下,我们可以将“不同”类型的查询放入 Future 中。

但是要在没有 N+1 的情况下获取多对一 实体 - 我们可以使用标准的 Criteria API。因此,即使这些属性被映射为懒惰的选择作为获取:

<many-to-one name="Account" class="FinanceAccount" column="AccountId" 
lazy="proxy" fetch="select"/>

此条件将只创建一个带有左连接的选择:

var list = session.CreateCriteria<Cheque>()
.SetFetchMode("Account", NHibernate.FetchMode.Join)
.SetFetchMode("customer", NHibernate.FetchMode.Join)
.SetFetchMode("Branch", NHibernate.FetchMode.Join)
.Future<Cheque>()
// or
// .List<Cheque>() ... will be the same right now
;

这将导致只有一个 SQL select 语句,加入 Check 及其引用属性。

关于nhibernate - 使用 NHibernate-Futures 获取 ManyToOne,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13661443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com