try to simply access the c.Customers and check (via show-sql or DB profiler) that the DB is not being hit, but the customers data is being hooked from the session cache.
On Fri, Oct 3, 2008 at 6:40 PM, Andrew Melnichuk <[EMAIL PROTECTED] > wrote: > Hi all. > > I have a complex object graph. There is a root entity which has a set of > collections (some of them are pretty big), entities in collections have > their own collections etc.. - a kind of tree. I need to fetch this tree with > minimum performance hit for database. I have tried 2 options for now: > 1st - load root entity, and then navigate through properties to load all > child and grandchild collections, ofcourse set fetch="subselect" in mapping > file before, to prevent select n+1 problem > 2nd - use approach, described here > http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/06/eager-loading-aggregate-with-many-child-collections.aspx, > where different collections load by different queries, but session is smart > enough, to merge different result to object graph, initializing different > collections. > > But i can't use 1st approach, because i can't define fetch plan on a global > level (number of reasons), and i can't use 2nd approach, because it seems > that it works fine for 1st level collection only, selecting deeper level > collections will produce cartesian product, which will grow with level of > query of collection. > > What i thought about, is would it be possible to use approach based on > several queries, like 2nd approach i mentioned. The difference is i tried to > start fetching not from the root entity level, but from the level i have to > fetch next, after i already fetched with previous query. For example: > > [Test] > public void Test1() > { > // load root entity > Country c = _session > .CreateQuery("from Country where Name = 'Germany'") > .List<Country>()[0]; > > // trying to load 1st level child collection > _sess > .CreateQuery("from Customer cs where cs.Country = :c") > .SetParameter("c", c) > .List(); > > Assert.That(NHibernateUtil.IsInitialized(c.Customers)); // > fails > } > > I thought that session will initialize Country.Customers collection, but it > is not. > Ofcourse i could use eager join for this collection and others at the same > level, but as i said this will causes cartesian product for deeper > collections. > I'm not sure that what i did is valid, maybe it is invalid by design, > however it seems that session can initialize customers collection, since it > "knows" to which country selected customers belongs. > > Just wanted to ask, how people solve same problems. > > -- > Best regards, > Andrew Melnichuk > > > > -- Ken Egozi. http://www.kenegozi.com/blog http://www.musicglue.com http://www.castleproject.org http://www.gotfriends.co.il --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/nhusers?hl=en -~----------~----~----~----~------~----~------~--~---
