我有域类位置
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"));
现在当我执行上述条件时,它会在userInfo.preference上出错。 {NHibernate.QueryException:无法解析属性:Otherinfo of:Location.User 这里有什么错误。是因为多嵌套对象
答案 0 :(得分:4)
请改用CreateAlias:
criteria.CreateAlias("User", "user", JoinType.InnerJoin);
criteria.CreateAlias("user.Otherinfo", "userInfo",JoinType.InnerJoin);
答案 1 :(得分:3)
这是为了寻找嵌套投影和使用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.B.C.CName
你不能用“。”点作为您的别名+您只能在别名中访问1级(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")
);