2011-10-27 10 views
0

NHibernateでこのようなクエリを作成することは可能ですか? 内部結合とサブクエリを持つNHibernate Criteriaエンジン

select hi.ContactId 
From dbo.vw_HostInterests hi INNER JOIN 
    ( Select cm1.ContactId 
     From dbo.vw_ContactMoments cm1 INNER JOIN 
      (
       Select Contactid 
       From dbo.vw_ProfileNaw 
       where GenderId = 1000 
      ) as pn1 on cm1.ContactId = pn1.ContactId 
     where cm1.ActivityId = 1001 
    )as cm on hi.ContactId = cm.ContactId 

どこhi.ActivityId = 1038

私は、INステートメントを使用して、正しい出力を作成するために管理してきましたが、私は本当にSQLのように、このように見えると思います。 下記の基準私が使用(ただし、交換したい)のINステートメントで上記のクエリの一部を示しています

ICriteria criteria = DbSession.CreateCriteria<Contact>(); 

var dCriteria1 = DetachedCriteria.For(typeof(VwHostInterest)) 
    .Add(Expression.Eq("ActivityId", 1038)) 
    .SetProjection(Projections.ProjectionList() 
    .Add(Projections.GroupProperty("ContactId"))); 

var dCriteria2 = DetachedCriteria.For(typeof(VwContactMoment)) 
    .Add(Expression.Eq("ActivityId", 1001)) 
    .SetProjection(Projections.ProjectionList() 
    .Add(Projections.GroupProperty("ContactId"))); 

criteria.Add(Subqueries.PropertyIn("ContactId", dCriteria1)); 
criteria.Add(Subqueries.PropertyIn("ContactId", dCriteria2)); 

int count = (Int32)criteria 
    .SetProjection(Projections.Count("ContactId")) 
    .UniqueResult(); 

答えて

0

おそらくないあなたが探している答えと謝罪、それはないですが、私の経験があなたのことであればこのような複雑なクエリでの最善の策は、になります。a)ビューとしてこの全体のことを行うとNHibernateの

Bでそれをマップ

)ビューとして内部選択を作成し、関係することができるようなマッピングを作成しますあなたのお問い合わせに

b)または、nhibernateをオーバーライドします(スキップして、OO用語ではなく)。これをネイティブSQLを使用して名前付きクエリとして記述します。

0

このネストされたクエリは、次の結果と同じ結果になりますか?

SELECT hi.ContactId 
FROM dbo.vw_HostInterests hi 
INNER JOIN vw_ContactMoments cm1 on hi.ContactId = cm1.ContactId 
    AND cm1.ActivityId = 1001 
INNER JOIN dbo.vw_ProfileNaw pn1 on pn1.ContactId = cm1.ContactId 
    AND pn1.GenderId = 1000 
WHERE hi.ActivityId = 1038 
関連する問題