我遇到某个查询的问题我正在尝试对付一对简单的连接类,如下例所示:
类:
public class ParentClass
{
public virtual Guid ParentClassId { get;set;}
public virtual ChildClass ChildClassRef { get;set;}
}
public class ChildClass
{
public virtual Guid ChildClassId { get;set;}
public virtual string ChildCode { get;set;}
}
Fluent Mappings:
public class ParentClassMap : ClassMap<ParentClass>
{
public ParentClassMap()
{
Id(x => x.ParentClassId).GeneratedBy.Guid();
References<ChildClass>(x => x.ChildClassRef, "ChildClassId").ForeignKey("ChildClassId").Fetch.Join();
}
}
public class ChildClassMap : ClassMap<ChildClass>
{
public ChildClassMap()
{
Id(x => x.ChildClassId).GeneratedBy.Guid();
Map(x => x.ChildCode).Not.Nullable();
}
}
这失败了:
DetachedCriteria criteria = DetachedCriteria.For(boType);
criteria.Add(Expression.Eq("ChildClassRef.ChildCode", "ABC"));
ICriteria runnableCriteria = detachedCriteria.GetExecutableCriteria(session);
IList ilistResult = runnableCriteria.List();
有错误:“无法解析属性:ChildClassRef.ChildCode”。
但是,此标准有效:
criteria.Add(Expression.Eq("ChildClassRef.ChildClassId", "931DAF7A-15D1-4B0B-8030-1C113BABC554"));
这与其他证据一起向我建议我的Fluent Reference映射是正确的(或者可能只是略有缺陷)。
编辑: 基础表:
ParentClass: ParentClassId, ChildClassId
ChildClass: ChildClassId, ChildCode
答案 0 :(得分:0)
我是一个nhibernate newb但我认为你首先必须使用CreateAlias在查询中加入表,然后才能查询其中一个属性。
答案 1 :(得分:0)
criteria.Add(Expression.Eq("ChildClassRef.ChildCode", "ABC"));
与
不同criteria.Add(Expression.Eq("ChildClassRef.ChildClassId", "931DAF7A-15D1-4B0B-8030-1C113BABC554"));
因为它引用了不同的属性(ChildCode!= ChildClassId)。另一方面,为了获得更好的结果,请使用CreateCriteria;
var criteria = DetachedCriteria.For<AccountingTransaction>();
criteria.Add(Restrictions.Eq("Period", period));
criteria.CreateCriteria("SimpleDocument", "d", NHibernate.SqlCommand.JoinType.InnerJoin);
criteria.Add(Restrictions.Like("d.DocumentCode", reference, MatchMode.Start));