I found 2 similar questions:
public IList<Person> GetAll()
{
var persons = session.QueryOver<Person>()
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Books).Eager
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Articles).Eager
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Addresses).Eager
.Future<Person>();
return persons.ToList();
}
I prefer to use the linq provider if at all possible especially if you are using newer versions of nhibernate (>= 4.0). As long as you have your collections mapped as ISets (requires .net framework >= 4) which we converted to such that we could do eager loading and avoid cartesian products. I feel like this isn't something that is heavily advertised but I prefer this method where applicable over anything else :
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>();
}
If you have your collections defined like the above then you can do the following and still avoid cartesian product issues:
var persons = session.Query<Person>()
.FetchMany(x => x.Books)
.FetchMany(x => x.Articles)
.FetchMany(x => x.Addresses)
.ToList();