nHibernate - 渴望获取已填充子列表的列表

时间:2010-05-12 12:53:22

标签: nhibernate eager-loading

我有一些对象:

Public Class Person() {
    public int Id {get;set;}
    public IList<Account> Accounts {get;set;}
    public string Email {get; set;}
}

public class Account(){
    public int Id {get;set;}
    public IList<AccountPayment> Payments {get;set;}
    public IList<Venue> Venues {get;set;}
}

public class AccountPayment(){
    public int Id {get;set;}
    public DateTime PaymentDate {get;set;}
    public decimal PaymentAmount {get;set;}
}

public class Venue(){
    public int Id {get;set;}
    public string AddressLine1 {get;set;}
    public string Postcode {get;set;}
}

这些类使用nHibernate映射到MS Sql - 每个类的db中都有一个表...

我想在我的存储库GetAccounts(int PersonID)中创建一个方法,该方法将返回一个List,其中所有帐户的子集合都以最有效的方式填充。任何人都可以给我任何关于如何做到这一点的指示 - 我真的不想在我的映射中将列表设置为子选项,如果我可以帮助它...

感谢。

2 个答案:

答案 0 :(得分:1)

如果您按照提及的方式将类映射到表,为什么不直接调用Person对象来获取所有帐户?从存储库中调用Person对象时,可以急切加载Accounts。像这样:

 public Person GetById(int id)
    {
        using (var tx = _sessionBuilder.GetSession().BeginTransaction())
        {
            // -- Lazy load way --
            //Person person = _sessionBuilder.GetSession().Get<Person>(id);
            //tx.Commit();
            //return person;

            // -- Eager load way --                
            Person person = _sessionBuilder.GetSession().CreateCriteria<Person>()
                   .Add(Restrictions.IdEq(id))
                   .SetFetchMode("Accounts", FetchMode.Eager)
                   .UniqueResult<Person>();
            tx.Commit();
            return person;
        }
    }

答案 1 :(得分:0)

好的,在尝试以多种方式做到这一点之后,我最终发现在这个问题上概述了最有效的解决方案:

Eager loading child collection with NHibernate

我上面的问题是我所遇到的实际挑战的一个非常简化的版本,但使用上述方法设法将数据库命中率降低到2 ......这是我最初实施时的巨大改进。

感谢您的帮助和指点。在路上学到了一点......