Pet*_*ter 4 nhibernate nhibernate-criteria
说我有两个班级:Parent和Child.A Parent有一个属性Children,当然是一组Child对象.
Child没有ParentId财产.它确实有一个Parent属性.
所以,我的NHibernate映射Child包括:
<many-to-one name="Parent" class="Parent" column="ParentId" cascade="save-update" />
Run Code Online (Sandbox Code Playgroud)
我的Parent映射包括:
<bag name="children" access="field" inverse="true" cascade="all-delete-orphan">
<key column="ParentId" />
<one-to-many class="Child" />
</bag>
Run Code Online (Sandbox Code Playgroud)
现在这就是我想要做的事情:我希望得到Child一定的所有对象ParentId.我知道我可以先得到Parent它然后归还它的Children财产.但是,如果我想Child直接查询表怎么办?
如果它是一个映射属性(例如Name),我可以使用NHibernate的标准,但在这种情况下,ParentId没有映射.
我尝试过使用类似的东西:
criteria.Add(Restrictions.Eq("Parent.Id", 1));
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我使用了SQLCriterion(如这里所解释的),但是一位朋友/同事让我觉得必须有更好的方法.
有任何想法吗?什么与投影和Restrictions.EqProperty?
您必须为关联路径添加别名.这将返回Parent的代理,假设使用延迟加载.您可以访问父级的Id属性而不会触发加载.
return _session.CreateCriteria<Child>()
.CreateAlias("Parent", "parent")
.Add(Restrictions.Eq("parent.Id", parentId))
.List<Child>();
Run Code Online (Sandbox Code Playgroud)
我已经使用查询完成了这个.这是一个例子:
Child foundChild =
session.QueryOver<Child>()
.Where(x => x.Parent.Id == 1234).SingleOrDefault<Child>();
Run Code Online (Sandbox Code Playgroud)