gpt4 book ai didi

nhibernate - 在 linq 中多次提取以进行休眠

转载 作者:行者123 更新时间:2023-12-03 12:10:33 25 4
gpt4 key购买 nike

我在看 this

Be careful not to eagerly fetch multiple collection properties at the same time. Although this statement will work fine:

var employees = session.Query() .Fetch(e => e.Subordinates) .Fetch(e => e.Orders).ToList();



我需要获取 2 个引用,所以我需要做类似的事情。有没有更好的方法来做到这一点。

我做不到 .ThenFetchMany()当它进入子对象时,但我在同一级别所追求的对象。

最佳答案

好吧,查询仍然会返回您想要的结果,但如前所述,它将返回笛卡尔积,即 SQL 查询将返回 count(e.Subordinates) * count(e.Orders)结果,这可能会很快加起来,特别是如果您有两个以上的集合。

NHibernate 介绍 Futures随着 2.1 版本。不幸的是,在当前的 NHibernate 3.0 版本中似乎没有办法让它们与 NHibernate.Linq ( session.Query<T>() ) 一起工作。

Futures 允许您在一次到数据库的往返中执行多个查询(只要数据库支持它,但大多数都支持)。在这种情况下,您将只有 count(e.Subordinates) + count(e.Orders)结果,这显然是最小值。

Futures 与标准 API、HQL 一起工作,它们应该与新的 QueryOver API 一起工作(我还没有测试过)。

NHibernate.Linq 确实有 Query().ToFuture() 和 Query().ToFutureValue(),但到目前为止我只在使用它们时得到异常。

编辑:

我刚刚再次检查了 Linq API,如果您不使用 Fetch,它似乎可以正常工作。以下将导致在一次往返中执行三个 SQL 查询。返回的总行数将为 1 + count(Subordinates) + count(Orders)。

int id = 1;

// get the Employee with the id defined above
var employee = repo.Session.Query<Employee>()
.Where(o => o.Id == id)
.ToFuture<Employee>();

// get the Subordinates (these are other employees?)
var subordinates = repo.Session.Query<Employee>()
.Where(o => o.HeadEmployee.Id == id)
.ToFuture<Employee>();

// get the Orders for the employee
var orders = repo.Session.Query<Order>()
.Where(o => o.Employee.Id == id)
.ToFuture<Order>();

// execute all three queries in one roundtrip
var list = employee.ToList();
// get the first (and only) Employee in the list, NHibernate will have populated the Subordinates and Orders
Employee empl = list.FirstOrDefault();

无论如何,感谢您将此标记为答案。

关于nhibernate - 在 linq 中多次提取以进行休眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208723/

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