2012-01-18 19 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(); 
関連する問題