假设我有两个课程:Parent
和Child
。 Parent
有一个属性Children
,当然是Child
个对象的集合。
Child
没有ParentId
属性。它确实有Parent
属性。
所以,Child
的NHibernate映射包括:
<many-to-one name="Parent" class="Parent" column="ParentId" cascade="save-update" />
我的Parent
映射包括:
<bag name="children" access="field" inverse="true" cascade="all-delete-orphan">
<key column="ParentId" />
<one-to-many class="Child" />
</bag>
现在这就是我想要做的事情:我希望获得具有特定Child
的所有ParentId
个对象。我知道我可以先获取Parent
然后返回其Children
属性。但是如果我想直接查询Child
表怎么办?
如果它是映射属性(例如,Name
),我可以使用NHibernate的标准,但在这种情况下,ParentId
未映射。
我尝试使用类似的东西:
criteria.Add(Restrictions.Eq("Parent.Id", 1));
但这不起作用。我使用了SQLCriterion(如here所述),但是一位朋友/同事让我觉得必须有更好的方法。
有什么想法吗?有投影的内容和Restrictions.EqProperty
?
答案 0 :(得分:6)
您必须为关联路径设置别名。这将返回Parent的代理,假设使用延迟加载。您可以访问父级的Id属性而不会触发加载。
return _session.CreateCriteria<Child>()
.CreateAlias("Parent", "parent")
.Add(Restrictions.Eq("parent.Id", parentId))
.List<Child>();
答案 1 :(得分:5)
我已经使用查询完成了此操作。这是一个例子:
Child foundChild =
session.QueryOver<Child>()
.Where(x => x.Parent.Id == 1234).SingleOrDefault<Child>();
答案 2 :(得分:0)
我认为可以通过Criteria这样做:
criteria.Add(Restrictions.Eq("Parent", Session.Load<Parent>(1));