linq中的多个提取物为nhibernate

时间:2011-03-06 04:34:56

标签: nhibernate

我在看this

  

小心不要急切地取   多个集合属性   同时。虽然这句话   工作正常:

     

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

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

我不能.ThenFetchMany()进入子对象,而是我在同一级别上的对象。

1 个答案:

答案 0 :(得分:32)

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

NHibernate在2.1版本中引入了Futures。不幸的是,在当前的NHibernate 3.0版本中似乎没有办法让它们与NHibernate.Linq(session.Query<T>())一起使用。

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

期货使用标准API,HQL,它们应该与新的QueryOver API一起使用(我还没有测试过)。

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

修改

我刚刚再次检查了Linq API,如果你不使用Fetch,它似乎正在运行。以下将导致在一次往返中执行的三个SQL查询。返回的总行数将是1 + count(下属)+ 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();

感谢您将此标记为答案。