Eagerly fetch multiple collection properties (using QueryOver/Linq)?

后端 未结 2 1298
误落风尘
误落风尘 2020-12-13 09:16

I found 2 similar questions:

  • Multiple Fetches in linq to nhibernate
  • Is this the right way of using ThenFetch() to load multiple collections?
相关标签:
2条回答
  • 2020-12-13 09:58
    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();
    }
    
    0 讨论(0)
  • 2020-12-13 09:59

    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();
    
    0 讨论(0)
提交回复
热议问题