2012-01-18 53 views
1

我试图使用查询到检索基于加入/子查询按照下面的例子实体的集合:NHibernate的QueryOver子选择或加入

var types = new List<ActivityType>{ActivityType.CommentMedia, ActivityType.KeepMedia}; 

return _sessionFactory.GetCurrentSession() 
       .QueryOver<Activity>() 
       .Where(a.Type.IsIn(types)) 
       .WithSubquery.WhereExists(QueryOver.Of<Resource>() 
        .Where(k => k.MemberKey == userId) 
        .Where(k => k.ResourceKey == activity.ResourceId) 
        ) 
       .Take(take) 
       .List(); 

换句话说检索它们中的所有活动资源表匹配用户和资源ID。

我会做这样的原始SQL或者通过加入到资源,或子查询:

where a.ResourceId in (select resourceKey from resource where resource.memberkey = a.MemberId) 

不知道如何在NHibernate的进行,虽然。有什么建议么?

(我们不希望使用的映射,因为我们要保持活动的实体由于性能原因很简单)

在此先感谢

+0

是使用QueryOver为此它需要,或者HQL也是一个选项? –

+0

查询结束会更好。在我看来,它应该是直截了当的。干杯 –

回答

3
Activity activity = null; 
return _sessionFactory.GetCurrentSession() 
      .QueryOver(() => activity) 
      .Where(a.Type.IsIn(types)) 
      .WithSubquery.WhereProperty(a => a.ResourceId).In(QueryOver.Of<Resource>() 
       .Where(k => k.MemberKey == userId) 
       .Where(k => k.ResourceKey == activity.ResourceId) 
       ) 
      .Take(take) 
      .List();