2011-10-27 3 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)는보기로이 모든 일을 할 당신이 관련 될 수 있도록 매핑을)

B NHibernate에

에서지도보기로 내부 선택을 생성하고 생성 그것의 질문에

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 
관련 문제