Nhibernate Projection over Nested Nested Properties

I have a domain class

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

Now, when I fulfill the above criteria, it gives an error in userInfo.preference. {NHibernate.QueryException: Failed to resolve property: Otherinfo: Location.User What is the error. this is due to the many nested objects

+6
source share
2 answers

Use CreateAlias ​​instead:

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

This is for someone looking for nested projections and a nested join with NHibernate criteria:

 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.BCCName 

you cannot use "." dot as an alias + you can only access level 1 within an 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") ); 
+3
source

Source: https://habr.com/ru/post/916565/


All Articles