2012-04-17 3 views
0

나는 NHibernate에서 새롭다. CreateSQLQuery 사용하여이 쓴 있지만 모든 가능한 경우 NHibernate 조건 형식으로 이동하고 싶습니다. 내 쿼리는 다음과 같습니다.왼쪽 외부 조인을 사용하는 복잡한 NHibernate 조건?

select parent.ID as Id, ValueA.Total as ValueACount, ValueB.Total as ValueBCount 
from ParentTable parent 
left outer join 
(
    select count(*) as Total, ID 
    from ChildTable 
    where state = 'ValueA' 
    group by ID 
) ValueA on ValueA.ID = parent.ID 
left outer join 
(
    select count(*) as Total, ID 
    from ChildTable 
    where state = 'ValueB' 
    group by ID 
) ValueB on ValueB.ID = parent.ID 

테이블 이름/값을 약간 추상화했습니다. 이 코드는 그대로 작동하지만 전체 솔루션에서이 쿼리 만 사용할 수 있습니다. 우리가 그걸 없앨 수 있는지 알고 싶습니다.

도움을 주실 수있는 모든 분들께 미리 감사드립니다. 나를 도울 수있는 정말 좋은 웹 페이지에 대한 링크를 제공하고 싶다면 괜찮습니다. 나는 적어도 당신을 위로 엄밀 해 할 것이다 :)

나는 또한 유사한 질문을 보았다. 다른 질문/답변이 나를 크게 도와 줄 것이라고 생각되면 자유롭게 저를 가리켜주십시오.

답변

2

당신은 내가 지금 두 번째 일을 시도하고 일부 LINQ 쿵푸에게

var results = from p in session.Query<Parent>() 
       select new 
       { 
        p.Id, 
        ValueACount = (from c1 in session.Query<Child>() where c1.State == "ValueA" && c1.Parent == p select c1).Count(), 
        ValueBCount = (from c2 in session.Query<Child>() where c2.State == "ValueB" && c2.Parent == p select c2).Count(), 
       }; 

또는 사용 기준

var results = session.CreateCriteria<Parent>("p") 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("Id")) 
     .Add(Projections.SubQuery(DetachedCriteria.For<Child>() 
      .Add(Restrictions.Eq("State", "ValueA") && Restrictions.EqProperty("Parent", "p")) 
      .SetProjection(Projections.RowCount()))) 
     .Add(Projections.SubQuery(DetachedCriteria.For<Child>() 
      .Add(Restrictions.Eq("State", "ValueB") && Restrictions.EqProperty("Parent", "p")) 
      .SetProjection(Projections.RowCount())))) 
    .List(); 
+0

을 시도 할 수 있습니다. 결과가 돌아 오지 않는 것 같습니다. 무엇이 잘못되었는지 확신하지 못합니다. 그것은 당신의 코드가 잘못 되었든 내 수업으로 재 번역 되었든간에. 내 수업은 필드와 필드가 테이블과 일치하지 않습니다. 그런 다음 필요한 속성을 가진 더미 클래스를 만들었습니다. 그것은 작동하지 않았다. 그러나 귀하의 코드로 뭔가를 발견했습니다. "Restrictions.EqProperty ('Parent', 'p')). 속성 이름이 아닌가요? 즉"Id ","Id "입니까? – vbullinger

+0

ids는 클래스의 일대 다 연관이라고 가정합니다. 내 코드는 sql'Select id, (c1parentid == p.id 및 c1.state = "valueA"인 자식 c1로부터 Count (*)를 선택해야한다) from 부모 p' – Firo

+0

오른쪽에있는 값이 왼쪽에 동일하면 EqProperty가 테스트 중이라고 생각했습니다 ... 매개 변수는 NHibernate 메타 데이터에서 lhs와 rhs라는 제목이 붙어 있습니다 ... 당신은 테이블 이름과 별명. 내가 오해 한가? – vbullinger

관련 문제