在NHIbernate (c#)中使用内部连接和分组时返回实体

本文关键字:连接 实体 返回 内部 NHIbernate | 更新日期: 2023-09-27 18:10:22

我被迫在这个项目中使用NHibernate,我只是想运行一个非常简单的查询。

我有两个表:Contacts和contachistory。我想返回在ContactHistories.....中至少有一条记录的Contact实体很简单。

在SQL中,我只需要输入
select c.ContactId
from Contacts c
inner join ContactHistories ch on ch.ContactId = c.ContactId
group by c.ContactId

返回这些联系人的id列表。

我该如何在NHibernate中返回实体?

到目前为止,我已经试过了:

ICriteria criteria = Session.CreateCriteria(typeof (Contact))
            .CreateAlias("ContactHistories", "ch", JoinType.InnerJoin)
            .SetProjection(Projections.GroupProperty("Id"))
            .Add(Restrictions.Eq("ch.Partner", partner))
            .SetResultTransformer(Transformers.DistinctRootEntity);
        return criteria.List<Contact>();

但是,这似乎只是返回一个id列表,而不是Contact实体列表。我:

值"3"不属于" mycompany . mynamspace . contact "类型。

我甚至可以接受使用Session的解决方案。

CreateQuery或Session.CreateSQLQuery

郑重声明,实体框架棒极了。

在NHIbernate (c#)中使用内部连接和分组时返回实体

如果你的ContactContactHistory表在映射中连接,并且Contact类有一个子ContactHistory的集合,你可以使用这个HQL查询来检索所有至少有一个历史记录的联系人:

var contacts = 
  s.CreateQuery("from Contacts c where size(c.ContactHistories) > 0")
  .List<Contact>();