2011-10-27 37 views
0

在NHibernate中創建一個看起來像這樣的查詢是否可行?帶內連接和子查詢的NHibernate標準引擎

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

我已經成功地創建與中陳述正確的輸出,但我真的像SQL,看起來像這樣。 以下標準顯示與報表我用上面查詢的一部分(但要替換):

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

也許不是你正在尋找和道歉,如果它不是答案,但我的經驗是,你的這種複雜的查詢最好的選擇將是:

一)做這件事的看法和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