【问题标题】:Multiple Fetches in linq to nhibernatelinq中的多个获取到休眠
【发布时间】:2014-07-04 13:50:01
【问题描述】:

我在看this

注意不要急于获取 多个集合属性 同时。虽然这个说法 可以正常工作:

var 员工 = session.Query() .Fetch(e => e.下属) .Fetch(e => e.Orders).ToList();

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

我不能做.ThenFetchMany(),因为它会进入子对象,但我在同一级别上追求的对象。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    好吧,查询仍然会返回您想要的结果,但如前所述,它将返回一个笛卡尔积,即 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) 结果,这显然是最小值。

    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();
    

    感谢您将其标记为答案。

    【讨论】:

    • 嗯,我想我将不得不等到他们为 linq 做好准备。我现在只使用 2 个集合,所以我应该没问题,直到他们把它拿出来(我真的不喜欢其他方式)。
    • @chobo2 我编辑了我的答案并为 NHibernate.Linq 提供了一个可行的可行解决方案
    • 如果我可以 +1 两次,我会的。这只是救了我。 谢谢
    • @FlorianLim - 你为什么一直提到与提供的代码无关的NHibernate.LinqNHibernate.LinqQuery&lt;T&gt; API 不是一回事。 Linq 提供程序是为 2.1 编写的,不应与 3.# 一起使用,因为 3.# 附带了自己的内置 Linq 提供程序。
    • @Phill 老实说,我真的不知道。我对此的最后一次回复是在两年多前,所以很可能是我使用了错误的术语并说“NHibernate.Linq”,而我的意思是内置的 Linq 提供程序(可能是因为它是同一个命名空间,不是是吗?)。无论如何,我从来没有真正使用过它,因为我更喜欢 QueryOver API。
    猜你喜欢
    • 2015-03-04
    • 2012-08-14
    • 2012-09-29
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多