如何使用NHibernate查询外键列,而不检索相关实体

Pet*_*ter 4 nhibernate nhibernate-criteria

说我有两个班级:ParentChild.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

Jam*_*Ide 6

您必须为关联路径添加别名.这将返回Parent的代理,假设使用延迟加载.您可以访问父级的Id属性而不会触发加载.

return _session.CreateCriteria<Child>()
    .CreateAlias("Parent", "parent")
    .Add(Restrictions.Eq("parent.Id", parentId))
    .List<Child>();
Run Code Online (Sandbox Code Playgroud)


Col*_*e W 5

我已经使用查询完成了这个.这是一个例子:

Child foundChild = 
    session.QueryOver<Child>()
        .Where(x => x.Parent.Id == 1234).SingleOrDefault<Child>();
Run Code Online (Sandbox Code Playgroud)