NHibernate惰性加载行为

NHibernate惰性加载行为,nhibernate,lazy-evaluation,lazy-loading,Nhibernate,Lazy Evaluation,Lazy Loading,我正在阅读这篇关于Nhibernate惰性加载的文章,它使用了一个类结构的示例,如下所示: var orders = session.QueryOver<Order>().List() var usersWithOrders = orders.Select(o => o.User); 然后,本文将显示以下代码: using (ISession session = SessionFactory.OpenSession()) { var fromDb = sessio

我正在阅读这篇关于Nhibernate惰性加载的文章,它使用了一个类结构的示例,如下所示:

var orders = session.QueryOver<Order>().List()

var usersWithOrders = orders.Select(o => o.User);

然后,本文将显示以下代码:

using (ISession session = SessionFactory.OpenSession())
{
    var fromDb = session.Get<Order>(_order.Id);
    int sum = 0;
    foreach (var line in fromDb.OrderLines)
    {
        // just some dummy code to force loading of order line
        sum += line.Amount;
    } 
}
整个集合将加载到内存中。这对我来说是一个问题,因为集合包含很多项,我只想更改一项,但是如果我将所有项加载到内存中并更改一项,然后尝试保存顺序,我的性能显然会非常差

那么,自从我写这篇文章以来,这种行为发生了变化吗?我只是误解了延迟加载是如何工作的?或者,是否有某种方法可以将NHibernate配置为仅从其需要的集合中加载项目?

“n+1 select语句问题。如果我们在加载订单后访问订单行项目,我们将为访问的每个行项目生成select语句。”不正确。订单行全部加载在一起,因为这在大多数情况下效率更高。选择N+1主要是这样的代码:

var orders = session.QueryOver<Order>().List()

var usersWithOrders = orders.Select(o => o.User);
var orders=session.QueryOver().List()
var usersWithOrders=orders.Select(o=>o.User);
因为订单有1个Select,每个用户有N个Select(实际上,由于会话缓存,仅针对不同的用户)

如果您知道自己拥有大量集合,并且只想处理一些集合或需要Count和Contains,则存在
/
HasMany(x=>x.Lines)。ExtraLazyLoad()
会生成一个集合代理,该代理发出Count查询,它包含[],而不是全部加载

或者您可以
session.QueryOver().Where(line=>line.Order==Order&&…
获取要处理的特定行