我被迫在这个项目中使用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的解决方案持开放态度。
对于记录,实体框架非常棒。
答案 0 :(得分:0)
如果映射中连接了Contact
和ContactHistory
表,并且Contact
类具有子ContactHistory
的集合,则可以使用此HQL查询来检索所有联系人至少有一个历史记录:
var contacts =
s.CreateQuery("from Contacts c where size(c.ContactHistories) > 0")
.List<Contact>();