2012-01-11 13 views
6

Próbuję użyć kryteriów Api w wielu tabelach z dużym obciążeniem.Eager Fetching with nhibernate Criteria API

Moi Podmioty wymontowane wyglądać następująco:

class Limit 
{ 
    Risk {get; set;} 
} 

class Risk 
{ 
    List<Company> Companies { get;set;} 
} 

class Company 
{ 
    List<Address> OldAdresses {get;set;} 
} 

class Address 
{ 
    string Street { get;set;} 
} 

Moje wezwanie Kryteria wygląda następująco:

var CriterionGruppe = Expression.Eq("Account.Id", someGuid); 

var temp = _transaktion.Session.CreateCriteria(typeof(Limit)) 
.SetFetchMode("Risk", FetchMode.Eager) 
.SetFetchMode("Risk.Companies", FetchMode.Eager) 
.Add(CriterionGruppe) 
.SetResultTransformer(new DistinctRootEntityResultTransformer()) 
.List<Limit>(); 

Adresy są nadal obciążone wieloma Wybiera. Jak mogę uwzględnić stare adresy firmy w wywołaniu kryteriów.

Już przeczytałem wpis na blogu na blogu ayende i kilka innych pytań tutaj na stackoverflow. Ale wciąż nie miał szczęścia.

Mam nadzieję, że ktoś wskaże mi właściwy kierunek.

góry dzięki peter

When must we use eager loading in NHibernate? What is it's usage?

NHibernate Eager Fetching Over Multiple Levels

Ayende Blog

Odpowiedz

8
var account = _transaktion.Session.Load<Account>(someGuid); 
var temp = _transaktion.Session.CreateCriteria(typeof(Limit)) 
    .SetFetchMode("Risk", FetchMode.Eager) 
    .SetFetchMode("Risk.Companies", FetchMode.Eager) 
    .SetFetchMode("Company.OldAddresses", FetchMode.Eager) 
    .Add(Expression.Eq("Account", account)) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .List<Limit>(); 

Jednak jest to bardzo nieefektywne. Ładujesz ogromną ilość duplikatów danych, aby utworzyć zapytanie 1 sql. Lepszym rozwiązaniem byłoby

  1. obciążenie projekcją tego, co jest rzeczywiście potrzebne
  2. użytku Futures i batched leniwy załadunku, aby uniknąć jednego kartezjańskiego zestaw wyników i wybierz N + 1.
+0

Dziękuję. Oto wskazówki, na które liczyłem. Wiedziałem, że nie było to zbyt skuteczne, jak pytałem. – user631833

Powiązane problemy