존재

2014-06-17 5 views
0

을 된 IQueryable을 확인존재

select cast(count(*) as INT) as col_0_0_ from "Parent" parent0_ where exists (select children1_.Id from "Child" children1_ where parent0_.Id=children1_.Parent_id and children1_.Name=? and children1_.Age=?)

인해 SQL CE 4.0의 성능을 관찰로, 내가 선호 즉, 같은 것 :

select cast(count(*) as INT) as col_0_0_ from "Parent" parent0_ join "Child" children1_ on parent0_.Id = children1_.Parent_id where children1_.Name=? and children1_.Age=?

NHibernate에 약하다고 확신하지만, 수많은 시도 후에도 QueryOver 또는 HQL로 되돌리지 않고 테이블에 조인하는 방법을 알아낼 수는 없지만 IQueryable<T>. 누군가 올바른 방향으로 나를 암시 할 수 있습니까?

+0

fyi, 나는 HQL로 되돌아 갔다. – Maate

답변

1

나는 그 아이를 질의하는 것이 좋다고 생각한다. 그런 다음 부모를 참조하면 원하는 것을 얻을 수있다.

session.Query<Child>() 
     .Where(c => c.Name == "Child") 
     .Where(c => c.Age == 10) 
     .Select(c=> c.Parent) 
     .Count(); 
1

두 번째 쿼리는 첫 번째와 동일하지 않습니다 : 그것은 어린이이 아니라 부모의 수를 세고.

부모를 계산하는 조인을 원할 경우 쿼리를 부모 당 하나의 자식을 반환하도록해야합니다. 더 탐색 속성이없는 경우 (이 것을 사용하는 것이 바람직 비록) 나는 NHibernate에 구문에 대한 올바른 LINQ를 모르겠지만, 일반 LINQ에서이

(from p in Parents 
from c in p.Children.Where(c => c.Name == "Child" && c.Age == 10) 
      .Take(1) 
select p).Count() 

과 같습니다

(from p in Parents 
from c in Children.Where(c => c.Name == "Child" && c.Age == 10 
          && c.ParentId == p.Id) 
        .Take(1) 
select p).Count()