Я предпочитаю использовать поставщика linq, если это вообще возможно, особенно если вы используете более новые версии nhibernate (> = 4.0).Пока ваши коллекции отображаются как ISets (требуется .net framework> = 4), которые мы конвертировали в такие, чтобы мы могли загружать их и избегать декартовых продуктов.Я чувствую, что это не то, что широко рекламируется, но я предпочитаю этот метод, где это применимо, чем что-либо еще:
public class Person
{
public virtual int Id { get; private set; }
public virtual ISet<Book> Books { get; set; }
public virtual ISet<Article> Articles { get; set; }
public virtual ISet<Address> Addresses { get; set; }
}
public Person()
{
this.Books = new HashSet<Book>();
this.Articles = new HashSet<Article>();
this.Addresses = new HashSet<Address>();
}
Если у вас есть коллекции, определенные как выше, то вы можете сделать следующее и все же избежатьпроблемы декартовых произведений:
var persons = session.Query<Person>()
.FetchMany(x => x.Books)
.FetchMany(x => x.Articles)
.FetchMany(x => x.Addresses)
.ToList();