2012-05-24 20 views
6

que tiene lugar la clase de dominioNhibernate proyección sobre las propiedades anidadas anidados

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

ahora cuando yo haga por encima de criterios, da error en userInfo.preference. {NHibernate.QueryException: could not resolve property: Otherinfo of: Location.User ¿Qué es un error aquí? ¿se debe a multi objetos anidados

Respuesta

4

Use CreateAlias ​​su lugar:

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

fue sólo de mi error tipográfico al publicar cuestión, en su código correcto. – Techmaster

+0

tiene alguna otra pista, hágamelo saber, me llamó la atención desde hace mucho tiempo. – Techmaster

+0

Sí seguro: use CreateAlias ​​en lugar de CreateCriteria - CreateCriteria lo moverá hacia abajo de la asociación, CreateAlias ​​es más natural - actualizó el ejemplo –

3

Esto es para otra persona en busca de proyecciones anidados y anidado con los Criterios de 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 

no se puede utilizar". " punto como su nombre de alias + sólo se puede acceder a 1 nivel más profundo de 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") 
      ); 
Cuestiones relacionadas