使用内部联接返回实体并使用NHIbernate进行分组(C#)

时间:2014-06-26 19:41:47

标签: c# nhibernate group-by entity inner-join

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

我有两个表:Contacts和ContactHistories。我想返回在ContactHistories中至少有一条记录的联系人实体.....非常简单。

在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列表而不是联系人实体列表。我明白了:

  

值“3”不是“MyCompany.MyNamespace.Contact”类型。

我甚至对使用Session.CreateQuery或Session.CreateSQLQuery的解决方案持开放态度。

对于记录,实体框架非常棒。

1 个答案:

答案 0 :(得分:0)

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

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