gpt4 book ai didi

sql - 在 NHibernate 3.0 Linq 中急切加载多个 sibling 和孙辈(堂兄弟?)的良好行为

转载 作者:行者123 更新时间:2023-12-01 02:50:42 25 4
gpt4 key购买 nike

我正在尝试使用 NHibernate 3.0 的 LINQ 接口(interface)执行以下操作。我想查询一个对象(使用一些 Where 子句),并加载一些子孙。目前我正在这样做:

var results = session.Query<Thing>()
.Where(...)
.Fetch(x => x.SubThingA)
.ThenFetch(st => st.SubSubThingA)

.Fetch(x => x.SubThingB)
.ThenFetch(st => st.SubSubThingB)

// etc...

但是,这会导致所有孙子之间的笛卡尔积(每个结果行都包含很多很多列)。这由“ayende” here 讨论。 .另一方面,我得到了一次往返,这与拆分查询然后组合它不同。

我怎样才能以更好的方式(SQL 和性能方面)做到这一点,仍然使用 NHibernate 的 LINQ 接口(interface)?

(一方面,我注意到当前 ToFuture 方法在您使用 Fetch 时不起作用)

非常感谢!

最佳答案

在大多数情况下,使用 batch-size 可以获得更好的性能。在实体和集合中,而不是创建大型查询。

最好的情况下,它是按每个根实体类型的 id 查询。

假设您有一个根实体 客户 ,其中包含 的集合订单 ,其中有 的集合订单项目 , 引用 产品 ,以及所有 batch-size属性设置为 1000 .

假设您检索了一个包含 10 个客户的列表,这些客户平均有 10 个订单,每个订单有 10 个产品:

var results = session.Query<Customer>().Where(...).Take(10).ToList();
  • 第一个查询将只获取客户。
  • 当您开始迭代第一个 customer.Orders 集合时,将使用一个查询来加载所有这些(针对所有客户)
  • 当您开始迭代第一个 order.OrderItems 集合时,将使用一个查询来加载所有这些(针对所有订单和所有客户)
  • 当您从第一个产品中读取一个属性时,将使用一个查询来加载所有这些

  • 所以,你只有 4 个查询 ,完全没有连接,通过 PK 检索所有内容。它既简单又高效。

    关于sql - 在 NHibernate 3.0 Linq 中急切加载多个 sibling 和孙辈(堂兄弟?)的良好行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5143480/

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