4

我有一些对象:

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),它将返回一个列表,其中包含以最有效的方式填充的所有帐户的子集合。谁能给我有关如何执行此操作的任何指示-如果我能提供帮助,我真的不想将列表设置为映射中的子选择...

谢谢。

4

2 回答 2

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;
        }
    }
于 2010-05-12T14:24:48.007 回答
0

好的,在尝试以多种不同方式执行此操作后,我最终发现在这个问题上概述了对我来说最有效的解决方案:

使用 NHibernate 急切加载子集合

我上面的问题是我遇到的实际挑战的一个大大简化的版本,但是使用上述方法设法将 db hits 降低到 2... 与我最初的实现相比有了巨大的改进。

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

于 2010-05-13T09:53:28.137 回答