2012-01-11 20 views
6

Estoy tratando de utilizar los criterios Api en varias tablas con carga ansiosa.Obtención de recolección con criterios nhibernate API

Mis Entidades reducidos al mínimo el siguiente aspecto:

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;} 
} 

Mi llamado Criterios ve así:

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>(); 

Las direcciones se siguen cargando con muchos Selecciona. ¿Cómo puedo incluir las direcciones antiguas de una empresa en mi convocatoria de criterios?

Ya leí una entrada de blog en el blog de ayende y varias otras preguntas aquí en stackoverflow. Pero aún no tuvo suerte.

Espero que alguien pueda señalarme en la dirección correcta.

Gracias de antemano Peter

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

NHibernate Eager Fetching Over Multiple Levels

Ayende Blog

Respuesta

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>(); 

Sin embargo, esto es muy ineficiente. Está cargando una gran cantidad de datos duplicados para hacer una consulta de 1 sql. Un mejor enfoque sería

  1. carga una proyección de lo que realmente se necesita
  2. Futuros uso y por lotes carga diferida para evitar un único resultado cartesiano configurar y seleccionar n + 1.
+0

Gracias. Estas son las pistas que esperaba. Sabía que no era muy eficiente como lo había preguntado. – user631833

Cuestiones relacionadas