2012-05-24 12 views
6

Ich habe Domain ToplageNhibernate Projektion über verschachtelte verschachtelte Eigenschaften

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

jetzt, wenn ich oben genannten Kriterien ausführen, gibt es Fehler auf userInfo.preference. {NHibernate.QueryException: konnte Eigenschaft nicht auflösen: Otherinfo von: Location.User Was ist Fehler hier. ist es verschachtelte Objekte Multi

Antwort

4

Verwendung Create statt wegen:

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

es war nur meine Tippfehler in einem Alias ​​tief zugreifen, während Frage veröffentlichen, seine in Code korrekt. – Techmaster

+0

Haben Sie einen anderen Hinweis, lassen Sie es mich wissen, ich bin von sehr langer Zeit getroffen. – Techmaster

+0

Ja sicher - verwenden Sie CreateAlias ​​anstelle von CreateCriteria - CreateCriteria wird Sie in die Assoziation, CreateAlias ​​ist natürlicher - aktualisiert das Beispiel –

3

Diese für für verschachtelte Projektionen suchen jemand anderes ist und mit NHibernate Criteria verbinden verschachtelt:

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 

Sie können nicht „verwenden. " Punkt als Aliasname + Sie nur 1 Stufe kann (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") 
      ); 
Verwandte Themen