2012-05-24 12 views
6

ho classe di dominio posizioneNHibernate proiezione sopra nidificati proprietà nidificate

public abstract class BaseEntity<T> where T: struct 
    { 
    public virtual T Id { get; set; } 
    public virtual bool Equals(BaseEntity<T> other) 
    } 

    public class Location : BaseEntity<Int32> 
    { 

    public User User {get;set;} 
    } 

    public class User : BaseEntity<Int32> 
    { 
    public string Name {get;set; 
    } 

    public OtherInfo Otherinfo {get;set;}; 
    } 
    public class OtherInfo 
    { 
    public string preference {get;set;}; 
    } 

    var criteria = session.CreateCriteria(typeof(Location), "alias"); 
    criteria.CreateCriteria("User", "user", JoinType.InnerJoin); 
    criteria.CreateCriteria("user.Otherinfo", "userInfo",JoinType.InnerJoin); 
    criteria.Add(Restrictions.Eq("user.Id", 100)); 
    criteria.SetProjection(Projections.Alias(Projections.Id(), "Id"),       Projections.Alias(Projections.Property("user.Name"), "Name"), Projections.Alias(Projections.Property("userInfo.preference "), "pref")); 

ora quando eseguo sopra criteri, dà errore userInfo.preference. {NHibernate.QueryException: impossibile risolvere la proprietà: Otherinfo di: Location.User Che cos'è l'errore qui. è a causa di multi oggetti nidificati

risposta

4

Utilizzare CREATEALIAS invece:

criteria.CreateAlias("User", "user", JoinType.InnerJoin); 
criteria.CreateAlias("user.Otherinfo", "userInfo",JoinType.InnerJoin); 
+0

era solo la mia errore di battitura durante la pubblicazione domanda, nel codice sua corretta. – Techmaster

+0

hai qualche altro indizio, per favore fammi sapere, sono colpito da molto tempo. – Techmaster

+0

Sì, certo - usa CreateAlias ​​invece di CreateCriteria - CreateCriteria ti sposterà verso il basso l'associazione, CreateAlias ​​è più naturale - ha aggiornato l'esempio –

3

Questo è per qualcun altro in cerca di proiezioni annidate e nidificato unirsi con Criteri NHibernate:

public class A 
{ 
    public B {get;set;} 
    public string PropertyA {get;set;} 
} 
public class B 
{ 
    public C {get;set;} 
}  
public class C 
{ 
    public string CName {get;set;} 
} 
//you want to project and join 3 tables querying from A and get CName of C 
// InstanceA.B.C.CName 

non è possibile utilizzare". " punto come il tuo nome alias + si può accedere solo 1 livello profondo all'interno di un alias (aliasA.PropertyA)

//you have to create 3 alias for each class/instance/table 
DetachedCriteria joinNested3tables = DetachedCriteria.For<A>("aliasA") //level 1 alias 
      .CreateAlias("aliasA.B", "aliasB", JoinType.InnerJoin) //level 2 alias 
      .CreateAlias("aliasB.C", "aliasC", JoinType.InnerJoin) //level 3 alias 
      .SetProjection(Projections.ProjectionList() 
      .Add(Projections.Property("aliasC.CName"), "CNameProjection") 
      //you cannot have more than 1 dot operator like below 
      //.Add(Projections.Property("aliasB.C.CName"), "CNameProjection") 
      );